Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/347.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/5/date/2.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
org.apache.commons.beanutils.MethodUtils.invokeMethod提供java.lang.NullPointerException_Java_Apache Commons - Fatal编程技术网

org.apache.commons.beanutils.MethodUtils.invokeMethod提供java.lang.NullPointerException

org.apache.commons.beanutils.MethodUtils.invokeMethod提供java.lang.NullPointerException,java,apache-commons,Java,Apache Commons,我使用的是org.apache.commons.beanutils.MethodUtils.invokeMethod。它给了我空指针异常 下面是我的第一节课 package com; import org.apache.commons.beanutils.MethodUtils; public class test { public static void main(String[] args) { test t = new test(); t.ge

我使用的是
org.apache.commons.beanutils.MethodUtils.invokeMethod
。它给了我空指针异常

下面是我的第一节课

package com;

import org.apache.commons.beanutils.MethodUtils;

public class test {

    public static void main(String[] args) {
        test t = new test();
        t.getName();
    }

    void getName() {
        try {
            Class c = Class.forName("com.test1");
            Object o = c.newInstance();
            System.out.println(o);
            String value = (String) MethodUtils.invokeMethod(o, "getValue",null);
            System.out.println("Results from getValue: " + value);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
下面是我的第二节课

package com;

public class test1 {

    public String getValue() {
        return "value";
    }

}
当我尝试运行测试时,它会给我以下错误

com.test1@1add2dd java.lang.NullPointerException at org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:167) at com.test.getName(test.java:18) at com.test.main(test.java:9) 通用域名格式。test1@1add2dd java.lang.NullPointerException 位于org.apache.commons.beanutils.MethodUtils.invokeMethod(MethodUtils.java:167) 位于com.test.getName(test.java:18) 位于com.test.main(test.java:9)
请帮助我希望简短的回答是您不能提供
null
作为
MethodUtils.invokeMethod
的第三个参数。我将解释为什么我怀疑这是真的(如果是真的,我真的可以提及这一点)

MethodUtils几乎可以肯定只是标准Java反射库的一层。它采用名称、类或参数形式的方法签名来查找方法。这是必需的,因为可以重写方法:

public void foo(String s) {
    System.out.println("Got a string: " + s);
}

public void foo(int i) {
    System.out.println("Got an int: " + i);
}
因此,
invokeMethod
调用将几个步骤捆绑在一起,但它仍然需要能够查找正确的
java.lang.reflect.Method
对象。为了做到这一点,它需要知道参数的类型(看起来您调用的版本只适用于一元方法)。因此,我能看到它能够做到这一点的唯一方法是对传入的对象调用
arg.getClass()
,如果传入
null
,则调用NPE


编辑:我的工作假设您打算调用
invokeMethod(Object-Object,String-methodName,Object-arg)
方法,这确实会出现上述问题。在下面Adam的评论之后,似乎很有可能您想要调用
invokeMethod(Object-Object,String-methodName,Object[]args)
方法,我相信在这种情况下该方法会起作用

在这种情况下,问题是由编译器的类型推断和方法签名解析引起的。
null
文本可以表示任何非原语类型,因此它可以用于
Object
Object[]
,但同时不表示这两种类型。由于这一点(以及规范的某些部分,我不是100%确定),编译器将
null
解释为
对象
,并调用该方法,其结果如上所述

如果您的代码包含足够的信息以将null标识为null数组,则可以通过强制转换:

String value = (String) MethodUtils.invokeMethod(o, "getValue", (Object[])null);
或通过指定给强类型变量:

Object[] args = null;
String value = (String) MethodUtils.invokeMethod(o, "getValue", args);

除了上述类型推断修复之外,您还可以通过显式提供参数的类信息,使用
MethodUtils
解决此问题:

MethodUtils.invokeMethod(o, "getValue", new Object[0], new Class[0]);
但使用标准,这将相对简单,甚至更清晰:

为什么不使用

String value = (String) MethodUtils.invokeExactMethod(o, "getValue",null);

is对空第三个参数也不例外

您使用的是哪个版本的beanutils?一切看起来都很好。你清理并重新编译了吗?为什么要使用反射创建一个新的com.test1?我没有任何反编译器,从eclipse类编辑器中发现beanutils是1.1版本,但不确定它是否精确。我在应用程序中遇到了空指针异常,因此编写了一个类似的独立程序。@Sridevi Laks:我认为您没有实际运行1.1版,因为该特定版本没有
MethodUtils
类。也许你应该试着下载最新版本并在你的项目中使用它,这样你就知道你在处理什么版本了。:“
args
-使用这些参数-将null视为空数组”对不起,我刚刚意识到我可能选择了错误的、重载的
invokeMethod
方法。Java编译器在判断
null
是否对应于
对象
参数和
对象[]
参数时选择了什么?+1让我对
微笑,嘿,如果你传入null
@Adam,那就是NPE,这是一个非常好的观点。从我对的阅读中,我希望
Object[]
方法被认为比
Object
更具体,因此被称为。但是很可能,
null
的类型推断已经发生,并确定它是一个
对象
,在这种情况下,另一个方法正好匹配…@Sridevi:也许您使用的库的版本与我看到的不同。在v1.8.3中,应该将
null
数组转换为空数组,尽管可以说,正如上面所说的那样,自己传入空数组更为清晰。
String value = (String) MethodUtils.invokeExactMethod(o, "getValue",null);