2012-08-14 115 views
0

我发布了这个this问题,这基本上等于尝试将Strings映射到Java中的函数。我试图通过创建一个HashMap <String, Method>来解决它,但是每次我尝试运行Method.invoke(this,args),其中args是对应于Method参数的对象数组时,我得到一个NullPointerException。我在我的HashMap中声明方法如下:mypackage.MyClass.class.getMethod ("methodName", args),其中args是对应于参数methodNameClass对象的数组。我一直在为此工作了几个小时,我开始非常沮丧。如果有人有任何建议,我会非常感激!Java:Method.invoke(this,args)NullPointerException

HashMap <String, Method> myMethods = new HashMap <String, Method>(); 
Class [] args = {param1.class, param2.class, param3.class}; 
myMethods.put ("aKey", mypackage.MyClass.class.getMethod ("aMethod", args)); 
Method thisTest = myTests.get (thisKey); 
Object [] args1 = {param1, param2, param3}; 
String thisResult = (String) thisTest.invoke (this, args1); // NPE occurs in this line 

Aug 14, 2012 10:37:36 PM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet jsp threw exception 
java.lang.NullPointerException 
     at mypackage.MyClass.myMethod (MyClass.java:61) 
     at org.apache.jsp.myMethod_jsp._jspService(getZabbix_jsp.java:70) 
     at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
     at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393) 
     at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320) 
     at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581) 
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) 
     at java.lang.Thread.run(Unknown Source) 
+4

请给我们看一些代码和堆栈跟踪。真的很难说出发生了什么事。 – 2012-08-14 21:15:00

+0

谢谢你的帮助,每个人......很明显,我在StackOverflow格式化方面遇到了一些麻烦。 – 2012-08-14 21:25:36

+0

是invoke()中的“this”调用正确类型的对象吗?在你的情况下,它必须是一个MyClass对象 – jrochette 2012-08-14 21:33:05

回答

1

尽管没有示myTests地图的人口,它显然不包含产生NPE的测试方法thisTest

这里要做的第一件事就是检查这个Map的内容,以确保它包含了请求的密钥。

此外,在尝试调用该方法以防止它炸毁之前,在thisTest上值得拥有guard clause

+0

是的,答案是我的一个愚蠢的语法错误。修复它使一切正常工作。感谢大家的时间和耐心。 – 2012-08-14 22:10:09

2

您需要使用反射时要有非常小心

参数Class务必与您正在搜索的method声明完全匹配。

例如,如果你有一个method,它利用MyAwesomeInterfaceinterface和您实现interfaceMyAwesomeImplementation,当你仰望的方法,你不能使用的MyAwesomeImplementationclass参考。

例如

getClass().getMethod("doAwesomeness", new Class[] {MyAwesomeImplementation.class}); 

将无法​​工作。它需要MyAwesomeInterface.class

我把这个小例子在一起工作得很好

public String methodToBeInvoked(String value, int iValue) { 

    return "You said " + value + " with " + iValue; 

} 

public MethodInvocation() { 

    Map<String, Method> myMethods = new HashMap<String, Method>(25); 
    try { 

     Method method = getClass().getMethod("methodToBeInvoked", new Class[]{String.class, int.class}); 

     myMethods.put("invoke", method); 

     System.out.println(myMethods.get("invoke").invoke(this, "Hello", 100)); 

    } catch (Exception exp) { 

     exp.printStackTrace(); 

    } 
} 

我怀疑你使用的查找方法不匹配方法声明的class参数。

确保method不是null当你看它&当您尝试&把它从地图上看,这将有助于缩小问题

1

如果thisResult为null,则此行只能生成NPE,这意味着thisKey未在myTests中初始化。使用“aKey”而不是thisKey,它应该可以工作。