我正在使用eclipse和java編程。有時我會遇到一個nullPointerException,它會困擾我幾個小時。無論如何,要更好地調試nullPointerExceptions並找出哪些變量值和其他會導致空指針異常的東西。一個很好的方法來調試nullPointerException
回答
查看堆棧跟蹤並讀取NullPointerException
所在的行號。幾乎總是,行有類似
x.getValue()
如果x
是null
,你會得到一個NullPointerException
一些方法調用。如果堆棧跟蹤頂部的方法不是您的代碼,請一直跟蹤堆棧,直到您到達代碼。在這種情況下,您經常會將null
傳遞給不喜歡null
參數的方法。找到並修復它。
此外,很多時候當您遇到不屬於您的方法拋出NullPointerException
時,請閱讀文檔。例如,看一下String.replace(CharSequence target, CharSequence replacement)
:
拋出:
NullPointerException
- 如果target
或replacement
是null
。
它沒有比這更清晰!
下面是一個例子:
綜觀4行,我們看到foo.bar()
。這意味着foo
是null
。那個很簡單。讓我們來看看另一個例子:
追溯你的代碼,我們可以看到,s.replace(target, replacement)
拋出。我們應該檢查target
和replacement
。讓我們一個調試器附加:
啊哈! replacement
是null
。你可以在Eclipse中做同樣的事情。爲引發異常時設置斷點,並使用它來檢查您的方法的參數。我在這裏很原始,因爲我來自一個思想流派,我真的相信,如果他們先學會了艱難的道路,那麼每個人都會變得更好。漏洞抽象等等。
一個例子或截屏用免費的圈子會很好:) – hexafraction
我的問題是,像函數(a,b,c,d,e)函數它不會告訴你哪個變量是空的。 –
@hexafraction:或甚至更好,8x10在帶有圓圈和箭頭的光面圖片中,每個圖片背面有一段說明每個圖片的使用方式。 –
有幾種方法可以使NullPointerException
不再是一個問題:
測試構造函數和設置函數中的參數
null
的參數值(避免使用簡單的舊Java代碼中的setter)。如果你這樣做了很多,你可以創建一個(Eclipse)源代碼模板來快速生成代碼。這被稱爲「failfast」 - 當代碼中進一步使用該值時,您不會等待拋出異常,例如,存儲在一個字段後。確保每行執行的操作數量最少(例如1或2)。如果你不這樣做,你需要找出
NullPointerException
發生在單行表達式中的位置。請勿在字段中使用
null
來指示狀態。相反,使用例如一個enum State
。例如。不要做if (socket == null) { // not connected }
,因爲以後很容易忘記檢查null
。明確的狀態不容易忘記。除非明確需要,否則不要初始化局部變量爲
null
。事實上,如果你正確處理你的範圍和例外,你應該能夠標記大多數變量final
。用throw new IllegalStateException("Unhandled program state", e)
代替默認的printStacktrace()
方法會有幫助,因爲它被視爲代碼塊的退出點。
經過大量的編程,你會發現NullPointerException
的數量下降。
在調試就可以使用
BreakPoints
視圖,捕捉空 指針。窗口 - >顯示視圖 - >斷點
在視圖中有一個
"J!"
,讓您在 例外設置斷點。您可以設置java.lang.NullPointerException
。因此,一旦拋出空指針異常 ,您可以檢查哪個變量導致 爲空。你可以做的其他事情是在編碼時捕獲可能的空指針訪問。當然你不能使用這個設置捕捉所有的空指針。但仍然有用,請在eclipse中設置以下設置。
首選項 - >爪哇 - >編譯器 - >錯誤/警告 - >無效分析
- 1. 需要一個很好的方法來測試Google測試中的工廠類
- 2. 任何人都有一個很好的方式來調試WPF焦點?
- 3. html5:一個很好的加載方法?
- 4. 有沒有一個很好的調試C++宏的通用方法?
- 5. 尋找一個很好的材料來採用單元測試編碼方法
- 6. Scala:尋找一個很好的方法來拆分數組
- 7. wxSmith一個很好的方法來管理wxPanel
- 8. 一個很好的方法來破壞TCP連接
- 9. 需要一個很好的方法來存儲名稱值對
- 10. JUnit調用調用另一個方法的方法返回nullPointerException
- 11. 尋找一個很好的方法來顯示mvvm的很多功能
- 12. 很好的使用屬性來確定調用的方法
- 13. 尋找一個很好的解決方案來調用一個bean中的http客戶端方法(即MDB,session)
- 14. Spring WebFlow - setter方法中的NullPointerException - 如何很好地處理
- 15. 有沒有一種很好的方法來調試RSpec(RSpec2)中依賴於順序的測試失敗?
- 16. php get_headers一個很好的方法來判斷一個網站是否啓動?
- 17. NullPointerException:試圖調用虛擬方法
- 18. 有沒有更好的方法來測試一個類的個別方法
- 19. lisp庫的一個很好的來源?
- 20. 一個很好的方式來實現l.php像Facebook一樣?
- 21. 一個很好的OO方式來做到這一點(C++)
- 22. 一個很好的方法來臨時記錄每個用戶的PHP DB?
- 23. 在EC2上遠程調試NodeJS的一個很好的解釋
- 24. 需要一個很好的網址來測試
- 25. 有沒有一種很好的方法來分類wp
- 26. 有很多:通過,更好的方法來做到這一點?
- 27. 尋找一種很好的方法來分開Javascript和HTML
- 28. CoreData - 有沒有一種很好的方法來放置物品?
- 29. 這是NSArray的複製方法的一個很好的用法?
- 30. Static Util方法vs實例Util方法 - 哪一個很好?
看看堆棧跟蹤......這說明了什麼線扔了NPE,你可以把一個看看哪個變量爲空... – chancea
學習如何調試NPE的最好方法是繼續調試它們。隨着時間的推移,你會變得更好。但關鍵是找出它發生的位置,然後檢查變量。這裏沒有魔法。 –
你可以將'assert'語句放入你的代碼 – MadProgrammer