Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:Method.invoke(this,args)NullPointerException_Java_Nullpointerexception - Fatal编程技术网

Java:Method.invoke(this,args)NullPointerException

Java:Method.invoke(this,args)NullPointerException,java,nullpointerexception,Java,Nullpointerexception,我发布了这个问题,基本上相当于试图将字符串映射到Java中的函数。我试图通过创建一个HashMap来解决这个问题,但是每次我尝试运行Method.invoke(这是args),其中args是与方法参数相对应的对象数组,我都会得到一个NullPointerException。我在我的HashMap中声明方法如下:mypackage.MyClass.class.getMethod(“methodName”,args),其中args是与methodName的参数对应的class对象的数组。我已经为此工

我发布了这个问题,基本上相当于试图将字符串映射到Java中的函数。我试图通过创建一个
HashMap
来解决这个问题,但是每次我尝试运行Method.invoke(这是args),其中args是与方法参数相对应的对象数组,我都会得到一个
NullPointerException
。我在我的
HashMap
中声明方法如下:
mypackage.MyClass.class.getMethod(“methodName”,args)
,其中
args
是与
methodName
的参数对应的
class
对象的数组。我已经为此工作了几个小时,我开始感到非常沮丧。如果有人有任何建议,我将非常感谢

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)
HashMap myMethods=newhashmap();
类[]args={param1.Class,param2.Class,param3.Class};
myMethods.put(“aKey”,mypackage.MyClass.class.getMethod(“aMethod”,args));
方法thisTest=myTests.get(thisKey);
对象[]args1={param1,param2,param3};
String thisResult=(String)thisTest.invoke(this,args1);//NPE发生在这一行
2012年8月14日晚上10:37:36 org.apache.catalina.core.StandardWrapper
严重:Servlet jsp的Servlet.service()引发异常
java.lang.NullPointerException
在mypackage.MyClass.myMethod(MyClass.java:61)中
在org.apache.jsp.myMethod_jsp._jsp服务(getZabbix_jsp.java:70)上
位于org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
位于org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)
位于org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
位于org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
位于org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
位于org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
位于org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
位于java.lang.Thread.run(未知源)

处理反射时,您需要非常小心

参数必须与正在搜索的
方法
声明完全匹配

例如,如果您有一个
方法
采用
MyAwesomeInterface
接口
,并且您在
myawesome实现
中实现了该
接口
,则在查找该方法时,您不能使用
myawesome实现
引用

比如说

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();

    }
}
publicstringmethodtobeinvoked(字符串值,int-iValue){
用“+iValue”返回“yousaid”+value+;
}
公共方法调用(){
Map myMethods=newhashmap(25);
试一试{
方法Method=getClass().getMethod(“methodToBeInvoked”,新类[]{String.Class,int.Class});
put(“调用”,方法);
System.out.println(myMethods.get(“invoke”).invoke(这个“Hello”,100));
}捕获(异常扩展){
exp.printStackTrace();
}
}
我怀疑用于查找方法的
参数与方法声明不匹配


当您查找
方法时,确保
方法不为
null
,当您尝试从映射中提取它时,它将有助于缩小问题的范围

在处理反射时,您需要非常小心

参数必须与正在搜索的
方法
声明完全匹配

例如,如果您有一个
方法
采用
MyAwesomeInterface
接口
,并且您在
myawesome实现
中实现了该
接口
,则在查找该方法时,您不能使用
myawesome实现
引用

比如说

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();

    }
}
publicstringmethodtobeinvoked(字符串值,int-iValue){
用“+iValue”返回“yousaid”+value+;
}
公共方法调用(){
Map myMethods=newhashmap(25);
试一试{
方法Method=getClass().getMethod(“methodToBeInvoked”,新类[]{String.Class,int.Class});
put(“调用”,方法);
System.out.println(myMethods.get(“invoke”).invoke(这个“Hello”,100));
}捕获(异常扩展){
exp.printStackTrace();
}
}
我怀疑用于查找方法的
参数与方法声明不匹配

当您查找
方法时,请确保
方法不为
null
,当您尝试从地图中拉出它时,它将有助于缩小问题的范围