没有调用它的Getter nullpointer

时间:2013-08-21 09:20:36

标签: java nullpointerexception

我在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

9 个答案:

答案 0 :(得分:10)

检查title是否为空:

  public String getTitle()
  {
    if(title != null && !title.isEmpty())
        return title;
    else 
        return "foo";
  }

p.s。 根据更新的问题添加其他评论:由于JSON解析器必须遍历对象的所有成员,因此可能没有简单的方法。只有我能想到的解决方案才能告诉杰克逊not to include null valuesimplement 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())

titlenull

请添加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";
}

除此之外,我会说所有其他答案都让你想要。