2

nullPointer我在 getter 方法上有问题。

这是代码:

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

当我将其更改为普通吸气剂时,它可以完美运行。

public String getTitle()
  {
    return title;
  }

诀窍在哪里?有反射技巧吗?

更新问题不是空检查,而是执行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

4

9 回答 9

10

检查是否title也为空:

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

ps 根据更新的问题附加评论:由于 JSON 解析器必须遍历对象的所有成员,因此可能没有简单的出路。我能想到的唯一解决方案是告诉杰克逊不要包含空值实现自定义映射器;如果性能是我最关心的问题,我会选择google-gson,因为他们的库非常好,并且比 Jackson 消耗更少的内存。

于 2013-08-21T09:21:39.130 回答
3

我特别注意到你的评论。不调用 getter。许多框架都使用JavaBean 约定,因此如果您指定一个属性title,框架就会调用 getTitle()

例如在 Spring 中(并不意味着您正在使用Spring):

<property name="title" value="abc"/>

会隐式调用你的设置器。

因此,您认为正在进行一些反思是正确的。我怀疑您在某处引用了 title 属性,并且使用的任何框架都在隐式调用您的 getter。如前所述,您的吸气剂中可能存在 NPE。断点会准确地告诉您它是如何被调用的。或者,实际上,您的异常堆栈跟踪。

编辑:我注意到你的堆栈跟踪,特别是:

org.codehaus.jackson.map.ser.BeanPropertyWriter.get(BeanPropertyWriter.java:483)

这表明正在使用这种反射。

于 2013-08-21T09:21:50.063 回答
2

在这里排队

  if(!title.isEmpty())

titlenull

请添加null检查。但是检查吸气剂不是一个好主意。反而

String title  ="foo"

public String getTitle()
  {
    return title;
  }

public String setTitle(String title)
    {
    this.title = title;
    }
于 2013-08-21T09:22:05.673 回答
1

如果您经常进行这些空/空检查,则可能值得包含Commons Lang

 return StringUtils.defaultIfBlank(title, "foo");

空安全并处理 Unicode 空白。

于 2013-08-21T09:23:52.503 回答
1
 if(!title.isEmpty())

您直接对标题执行操作,而不检查它是否为空。你必须先做NPE检查

if(title != null) {
if(!title.isEmpty())
    return title;
 } 
 return "foo";
于 2013-08-21T09:24:39.640 回答
0

标题可能是null.

public String getTitle() {
    if(title !=null && !title.isEmpty())
        return title;
    else 
        return "foo";
}
于 2013-08-21T09:24:18.910 回答
0

我个人会在这里使用三元运算

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

除此之外,我想说所有其他答案都能满足您的需求。

于 2013-08-21T09:30:36.197 回答
0

您也可以将标题定义为: String title = "";

于 2013-08-21T09:26:39.397 回答
0

您的title对象为空,因此调用isEmpty它会引发空指针异常。

即使在第二种title选择中也是 null 但由于您没有在其上调用任何方法,因此它不会引发空指针异常。

于 2013-08-21T09:23:18.220 回答