我在getter方法中遇到nullPointer
问题。
以下是代码:
public String getTitle()
{
if(!title.isEmpty())
return title;
else
return "foo";
}
当我将其更改为普通吸气剂时,效果非常好。
public String getTitle()
{
return title;
}
诀窍在哪里?有反射技巧吗?
UPDATE 问题不是空检查,而是在没有调用它的情况下使用getter
栈跟踪
org.codehaus.jackson.map.JsonMappingException: (was java.lang.NullPointerException) (through reference chain: java.util.ArrayList[0]- >si.mikropis.webkiosk.model.vao.wine.Wine["title"])
Caused by: java.lang.NullPointerException
at si.mikropis.webkiosk.model.vao.base.BaseModel.getTitle(BaseModel.java:41)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.codehaus.jackson.map.ser.BeanPropertyWriter.get(BeanPropertyWriter.java:483)
at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:418)
at org.codehaus.jackson.map.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:150)
... 32 more
答案 0 :(得分:10)
检查title
是否为空:
public String getTitle()
{
if(title != null && !title.isEmpty())
return title;
else
return "foo";
}
p.s。 根据更新的问题添加其他评论:由于JSON解析器必须遍历对象的所有成员,因此可能没有简单的方法。只有我能想到的解决方案才能告诉杰克逊not to include null values或implement a custom mapper;如果表现是我所关心的问题,我会选择google-gson,因为他们的图书馆比杰克逊图书馆的内存消耗更少,内存消耗更少。
答案 1 :(得分:2)
我特别注意到你的评论 re。没有打电话给吸气剂。许多框架使用JavaBean convention,因此如果您指定属性title
,框架将调用 getTitle()
。
e.g。在Spring中(并不意味着你使用 Spring):
<property name="title" value="abc"/>
会隐式调用你的setter。
所以你建议有一些反思是正确的。我怀疑你在某个地方引用了title属性,而且无论使用什么框架都是隐式调用你的getter。如上所述,您可能在吸气剂中有可能的NPE。断点将准确地告诉您如何调用它。或者,事实上,你的异常堆栈跟踪。
编辑:我注意到你的堆栈跟踪,特别是:
org.codehaus.jackson.map.ser.BeanPropertyWriter.get(BeanPropertyWriter.java:483)
表明正在使用这种反射。
答案 2 :(得分:2)
这一行
if(!title.isEmpty())
title
是null
。
请添加null
check.But check in getter不是一个好主意。而是
String title ="foo"
public String getTitle()
{
return title;
}
public String setTitle(String title)
{
this.title = title;
}
答案 3 :(得分:1)
如果你经常进行这些空/空检查,可能需要加入Commons Lang。
return StringUtils.defaultIfBlank(title, "foo");
Null-safe并处理Unicode空格。
答案 4 :(得分:1)
if(!title.isEmpty())
您正在直接对标题执行操作,而不检查它是否为空。你必须先进行NPE检查
if(title != null) {
if(!title.isEmpty())
return title;
}
return "foo";
答案 5 :(得分:0)
您的title
对象为null,因此在其上调用isEmpty
会抛出空指针异常。
title
即使在第二种方法中也是null,但因为你没有调用任何方法,所以它不会抛出空指针异常。
答案 6 :(得分:0)
标题可能是null
。
public String getTitle() {
if(title !=null && !title.isEmpty())
return title;
else
return "foo";
}
答案 7 :(得分:0)
您也可以将标题定义为: String title =“”;
答案 8 :(得分:0)
我个人在这里使用ternary操作
public String getTitle() {
return (title !=null && !title.isEmpty()) ? title : "foo";
}
除此之外,我会说所有其他答案都让你想要。