我在Groovy中有一段简单的代码:
ErrorInfoVO vo = new ErrorInfoVO();
Object obj1 = vo;
System.out.println(obj1.class.getName());
System.out.println(obj1.getClass().getName());
Map map = new HashMap()
Object obj2 = map
System.out.println(obj2.getClass().getName());
System.out.println(obj2.class.getName());
输出为:
com.vo.ErrorInfoVO
com.vo.ErrorInfoVO
java.util.HashMap
Exception in thread "main" java.lang.NullPointerException:
为什么obj2.class
返回空值?
答案 0 :(得分:4)
您之所以得到NullPointerException
是因为
obj2.class
不翻译为
obj2.getClass()
而是
obj2.get("class")
这是因为在您的案例中,obj2
的类型为Map
,并且您使用了属性符号。这意味着obj2.class
返回与名为class
的键相关联的值,并且与该键相关联的键值条目在您的映射中不存在,因此它返回null
。然后,您调用getName()
方法,并得到NullPointerException
。
该用例在Groovy文档页面Working with collections, 2.2. Map property notation中进行了描述:
注意:根据设计
map.foo
,将始终在地图中查找键foo
。这意味着foo.class
将在不包含类密钥的地图上返回null
。如果您真的想了解该类,则必须使用getClass()
:def map = [name: 'Gromit', likes: 'cheese', id: 1234] assert map.class == null assert map.get('class') == null assert map.getClass() == LinkedHashMap // this is probably what you want