2011-03-02 130 views
1

我使用一个类,使我的Hibernate查询通过FilterCriterionList(排序finder),它一直工作到现在完美,并触发NullPointerException,我完全不知道为什么它被触发。ReflectionUtil getField抛出NullPointerException

这是与下面的值触发空指针的方法(在ReflectionUtil)(请注意,在它抛出的其他价值完美地工作,它只是这些,似乎给出错误):

类型=接口java.util.List中

的fieldName =参数

首先,它抛出NoSuchFieldException和它的第二次运行(因为它是在字段再次调用= 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; 
    } 

任何想法为什么发生这种情况(或我能做些什么来解决它?)。我不能真正炫耀更多的代码,因为它非常复杂,它是公司代码。

+1

stacktraces很有用,你知道的。 – Bozho 2011-03-02 09:15:01

回答

1

java.util.List是一个接口,因此调用getSuperclass()就会产生null

申请getField()递归正确的方法是:

} catch (Exception e) { 
    Class superclass = type.getSuperclass(); 
    if (superclass != null) { 
     field = getField(superclass, fieldName); 
    } 
} 
0

你叫这样的:

getField(List.class, "parameter"); 

这本来从未做过列表是一个接口,它doesen't有任何称为参数的字段。对于第二个调用,它的'null因为接口List doesnet有一个超类。

0

从Class.getSuperclass文档

返回表示实体的 超类(类, 接口,基本类型或void) 此Class表示的类。 如果这个 类代表对象 类,接口,基元类型, 或void,则返回空值。如果 该对象表示一个数组类 ,则返回代表 Object类的Class对象。

相关问题