2013-08-21 68 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操作。