2015-04-01 72 views
0

我對這個問題感到困惑: 是否有這樣一種情況,即以下三行中的第一行可以產生java.lang.NullPointerException?java.lang.NullPointerException遇到意想不到的地方

if (mJobs == null || mJobs.size() == 0) { <-- trace shows exception here 
    return null; 
} 

這個例外情況出現在無根據的Android 4.4.4手機上。 mJobs聲明如下:

ArrayList<Job> mJobs; 

任何想法,將不勝感激。

更新:這次崩潰發生了數千次運行的一次。

+3

我們可以看到堆棧跟蹤嗎? '作業'是你寫的課嗎? – 2015-04-01 17:47:40

+0

清潔,重建,再次測試。並確保在Job.size()方法內不引發異常。 – 2015-04-01 17:56:51

+1

你應該真的發佈堆棧跟蹤甚至是Job類。無論如何,您可能希望通過使用mJobs.isEmpty()來使其更清晰。 – bphilipnyc 2015-04-01 18:04:17

回答

1

不,假設您使用的是java.util.ArrayList而不是您自己的實現。

使用isEmpty()而不是size() == 0會更清楚。我還會檢查這些代碼是如何被調用的,因爲在這兩種情況下你都返回null

0

編輯說,Java的「短路」評估不應該導致mJobs.size()被評估,你可以試試看看它是否失敗。

if (mJobs == null) { 
    return null; 
} 
if (mJobs.size() == 0) { <-- trace shows exception here 
    return null; 
} 
+2

請解釋一下,你有什麼資料嗎?我一直認爲mJobs.size()在OR的左邊部分爲true的情況下永遠不會被評估。 – 2015-04-01 17:47:45

+3

由於短路,沒有理由分開。 – 2015-04-01 17:49:34

+0

我很確定這個解釋是無效的。至少我真的希望它是無效的。 :) – 2015-04-01 18:12:28

0

如果mJobs爲null,再有就是扔在mjobs.size)空指針異常(

if (mJobs == null || (mJobs !=null && mJobs.size() == 0)) { 
    return null; 
} 
+0

不是真的,沒有。 '||'短路。 *可能在*'size'中,但非空檢查是多餘的。 – 2015-04-01 17:49:46

+0

對不起,但你的回答是錯誤的。在mJobs == null的計算結果爲true的情況下,mJobs!= null的計算結果爲false,如果在左側未精簡,則在右側也不會精簡。 – 2015-04-01 17:51:19

+0

如果mJobs!= null評估爲false,則不會執行正確的部分 – Martin 2015-04-01 17:51:49

3

我不認爲有你的NullPointerException是來自任何方面的可能性那第一行代碼。我敢打賭,你正在運行的代碼是從你正在查看的源代碼的不同版本編譯而來,讓你相信這個錯誤與其實際上不同。我會重新編譯你當前的代碼,然後運行它新鮮。

+0

或異常是從Job.size()方法中拋出的。 – 2015-04-01 17:55:57

+3

他沒有調用Job.size()方法。他正在調用數組列表的大小方法。 mJobs是一個數組列表。由於他已經通過短路||檢查了陣列列表是否不爲空,因此他可以安全地檢查其大小。 – Troy 2015-04-01 18:05:25

+0

當然!我的壞...感謝您的解釋。 – 2015-04-01 21:12:50

0

問題是或當然,或意味着它說,所以運行時間正在評估雙方或真正的繼續前進。短路不會發生在評估中,因此如果您使用三元操作,則可以在短路情況下將它們組合在一起。與拆分它們相同,只是更短。

if (mJobs == null ? true : mJobs.size() == 0) { 
    return null; 
} 
+2

根據規格不符合。如果mJobs爲null,則不評估右側,至少在Java中。 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.24 – bphilipnyc 2015-04-01 18:12:52