我使用一个通过FilterCriterionList(有点查找器)创建Hibernate查询的类,它一直工作到现在为止并触发NullPointerException,我完全不知道为什么它会被触发。
这是一个方法(在ReflectionUtil中),它使用以下值触发nullpointer(请注意,抛出的其他值可以完美地工作,而且只是这些似乎给出了错误):
type = interface java.util.List
fieldName = parameter
首先它抛出NoSuchFieldException并在它的第二次运行(因为它在field = getField(type.getSuperclass(),fieldName)再次调用;)使它抛出NullPointerException并且停止死亡(所有这些都发生在我的UnitTest中,而不是实时环境尚未)。
public static Field getField(Class type, String fieldName) {
Field field = null;
try {
field = type.getDeclaredField(fieldName);
} catch (Exception e) {
if (!type.equals(Object.class)) {
field = getField(type.getSuperclass(), fieldName);
}
}
return field;
}
关于为什么会发生这种情况的任何想法(或者我可以做些什么来解决它?)。我无法真正展示更多代码,因为它非常复杂,而且是公司代码。
答案 0 :(得分:1)
java.util.List
是一个界面,因此在其上调用getSuperclass()
会产生null
。
以递归方式应用getField()
的正确方法如下:
} catch (Exception e) {
Class superclass = type.getSuperclass();
if (superclass != null) {
field = getField(superclass, fieldName);
}
}
答案 1 :(得分:0)
getField(List.class, "parameter");
它本来不会工作,因为List是一个接口而且它没有任何名为参数的字段。对于第二个调用,它的'null因为接口List donet有一个超类。
答案 2 :(得分:0)
来自Class.getSuperclass文档
返回表示的类 实体的超类(类, 接口,原始类型或void) 由本课程代表。 如果这样 Class表示Object class,接口,原始类型, 或者void,然后返回null 。如果 此对象表示数组类 然后是表示对象的Class对象 返回对象类。