2012-08-14 147 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,它應該可以工作。