2013-07-26 56 views
16

我正在使用eclipse和java編程。有時我會遇到一個nullPointerException,它會困擾我幾個小時。無論如何,要更好地調試nullPointerExceptions並找出哪些變量值和其他會導致空指針異常的東西。一個很好的方法來調試nullPointerException

+2

看看堆棧跟蹤......這說明了什麼線扔了NPE,你可以把一個看看哪個變量爲空... – chancea

+0

學習如何調試NPE的最好方法是繼續調試它們。隨着時間的推移,你會變得更好。但關鍵是找出它發生的位置,然後檢查變量。這裏沒有魔法。 –

+1

你可以將'assert'語句放入你的代碼 – MadProgrammer

回答

22

查看堆棧跟蹤並讀取NullPointerException所在的行號。幾乎總是,行有類似

x.getValue() 

如果xnull,你會得到一個NullPointerException一些方法調用。如果堆棧跟蹤頂部的方法不是您的代碼,請一直跟蹤堆棧,直到您到達代碼。在這種情況下,您經常會將null傳遞給不喜歡null參數的方法。找到並修復它。

此外,很多時候當您遇到不屬於您的方法拋出NullPointerException時,請閱讀文檔。例如,看一下String.replace(CharSequence target, CharSequence replacement)

拋出

NullPointerException - 如果targetreplacementnull

它沒有比這更清晰!

下面是一個例子:

enter image description here

綜觀4行,我們看到foo.bar()。這意味着foonull。那個很簡單。讓我們來看看另一個例子:

enter image description here

追溯你的代碼,我們可以看到,s.replace(target, replacement)拋出。我們應該檢查targetreplacement。讓我們一個調試器附加:

enter image description here

啊哈! replacementnull。你可以在Eclipse中做同樣的事情。爲引發異常時設置斷點,並使用它來檢查您的方法的參數。我在這裏很原始,因爲我來自一個思想流派,我真的相信,如果他們先學會了艱難的道路,那麼每個人都會變得更好。漏洞抽象等等。

+2

一個例子或截屏用免費的圈子會很好:) – hexafraction

+1

我的問題是,像函數(a,b,c,d,e)函數它不會告訴你哪個變量是空的。 –

+2

@hexafraction:或甚至更好,8x10在帶有圓圈和箭頭的光面圖片中,每個圖片背面有一段說明每個圖片的使用方式。 –

4

有幾種方法可以使NullPointerException不再是一個問題:

  1. 使用@Nullable annotation

  2. 測試構造函數和設置函數中的參數null的參數值(避免使用簡單的舊Java代碼中的setter)。如果你這樣做了很多,你可以創建一個(Eclipse)源代碼模板來快速生成代碼。這被稱爲「failfast」 - 當代碼中進一步使用該值時,您不會等待拋出異常,例如,存儲在一個字段後。

  3. 確保每行執行的操作數量最少(例如1或2)。如果你不這樣做,你需要找出NullPointerException發生在單行表達式中的位置。

  4. 請勿在字段中使用null來指示狀態。相反,使用例如一個enum State。例如。不要做if (socket == null) { // not connected },因爲以後很容易忘記檢查null。明確的狀態不容易忘記。

  5. 除非明確需要,否則不要初始化局部變量爲null。事實上,如果你正確處理你的範圍和例外,你應該能夠標記大多數變量final。用throw new IllegalStateException("Unhandled program state", e)代替默認的printStacktrace()方法會有幫助,因爲它被視爲代碼塊的退出點。

經過大量的編程,你會發現NullPointerException的數量下降。

17
  1. 在調試就可以使用BreakPoints視圖,捕捉空 指針。

    窗口 - >顯示視圖 - >斷點

    在視圖中有一個"J!",讓您在 例外設置斷點。您可以設置java.lang.NullPointerException。因此,一旦拋出空指針異常 ,您可以檢查哪個變量導致 爲空。

  2. 你可以做的其他事情是在編碼時捕獲可能的空指針訪問。當然你不能使用這個設置捕捉所有的空指針。但仍然有用,請在eclipse中設置以下設置。

    首選項 - >爪哇 - >編譯器 - >錯誤/警告 - >無效分析

相關問題