2013-08-21 23 views
2

我在使用getter方法时遇到nullPointer问题。Getter空指针没有调用它

下面是代码:

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

当我将其更改为正常的getter它完美的作品。

public String getTitle() 
    { 
    return title; 
    } 

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

UPDATE 的问题是不是null检查,但不调用它

堆栈跟踪

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

+1

我会发布您的完整堆栈跟踪。 –

+0

请添加您的IDE(Netbeans,Android SDK,...),包含的库(log4j,AndroidAnnotations,...)以及使用的框架(例如Hibernate,Struts,...)。 – Trinimon

+0

我使用泽西岛和杰克逊。 –

回答

2

我特别注意您的意见re。不要致电。许多框架使用JavaBean convention,这样如果您指定属性title,框架将调用getTitle()

例如在Spring(不是你正在使用春暗示):

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

会隐含的调用制定者。

所以你是对的建议有一些反思正在进行。我怀疑你是在某处引用title属性,并且任何使用的框架都隐式调用你的getter。如上所述,你可能在你的吸气器中有一个NPE。一个断点会精确地告诉你它是如何被调用的。或者,事实上,你的异常堆栈跟踪。

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

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

这表明这样的反射被使用。

+0

setTitle稍后会出现,我会在创建对象时获得NPE。我不使用弹簧。 –

+0

@Brian:尽管这解释了为什么要调用getter,但这并不能解释为什么第一个不应该起作用。我不知道任何取决于getter的实现的框架... – Trinimon

+1

@ extra90 - 我不是建议你使用Spring。但我暗示框架是这样工作的,提名一个财产将导致相应的设置者/获取者被调用 –

10

检查excecuting吸气,如果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,因为他们的库比杰克逊的内存消耗更少,内存消耗也更少。

+0

只有2'l's null –

+1

是的,但问题是,没有调用它的getter是擅长的。 –

+0

@ extra90在其中设置断点并在执行时检查堆栈跟踪。 –

2

在这里,在线路

if(!title.isEmpty()) 

titlenull

请加null检查。但检查getter并不是一个好主意。而不是

String title ="foo" 

public String getTitle() 
    { 
    return title; 
    } 

public String setTitle(String title) 
    { 
    this.title = title; 
    } 
+0

我认为这并没有解决OP的问题。该吸气剂不被称为*明确* –

+0

@BrianAgnew雅,我补充说,作为一个建议,后我在我的第一行解决这个问题。 –

0

title对象为空,因此呼吁isEmpty它抛出空指针异常。

即使在第二种选择中title也是空的,但是因为您没有调用任何方法,所以它不会抛出空指针异常。

1

如果你做了这些空/空的检查很多,它可能是值得包括Commons Lang

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

Null-safe并处理Unicode空格。

0

标题可能是null

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

正在直接执行的标题操作时不检查其是否为空或不是。你必须做NPE首先检查

if(title != null) { 
if(!title.isEmpty()) 
    return title; 
} 
return "foo"; 
+0

downvote的原因是什么? –

+0

我没有给出该getTitle()的代码我只是想强调NPE检查。无论如何编辑我的代码。 –

0

您也可以定义标题: 字符串title = “”;

0

我个人倒在这里使用

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

除此之外,我想说所有其他的答案给你想你想ternary操作。