我已经将错误追踪到java.lang.Class类的第362行:
Constructor<T> tmpConstructor = cachedConstructor;
似乎没有分配变量。在调试表达式窗口中,它只说“tmpConstructor无法解析为变量”。 cachedConstructor不为null。
只有在调用newInstance()函数时才会进一步抛出错误:
try {
return tmpConstructor.newInstance((Object[])null);
} catch (InvocationTargetException e) {
Unsafe.getUnsafe().throwException(e.getTargetException());
// Not reached
return null;
}
上下文: 使用带有Struts2框架的JSON插件从收到的JSON创建Java对象。 它试图解析的字段是抽象类的子类。
在进一步检查时(感谢user902838)我错过了它无法实例化抽象类。所以我需要找出它如何实例化子类,这是一个不同的问题。
有人可以向我解释为什么tmpconstructor是空的吗?
答案 0 :(得分:0)
如果没有关于您尝试实例化的类或您观察到的异常/错误的任何信息,很难说,但我最好的猜测是该类没有一个无效的构造函数。该程序存在这样的问题:
package example;
public class NewInstanceTest {
public NewInstanceTest(String s) {
}
public static void main(String[] args) throws Exception {
Class.forName("example.NewInstanceTest").newInstance();
}
}
可以通过添加一个无效的构造函数来解决问题:
package example;
public class NewInstanceTest {
/* nullary constructor: */
public NewInstanceTest() {
this("default");
}
public NewInstanceTest(String s) {
}
public static void main(String[] args) throws Exception {
Class.forName("example.NewInstanceTest").newInstance();
}
}
或删除所有非空构造函数,以便Java自动提供一个nullary:
package example;
public class NewInstanceTest {
public static void main(String[] args) throws Exception {
Class.forName("example.NewInstanceTest").newInstance();
}
}