每个Java开发人员应拥有的持久断点
當開發人員使用Java進行工作時,即使您嘗試調試其他內容,也總是會遇到一些失敗的情況。 這是應該在每個IDE中啟用的持久斷點的列表。 (恕我直言)
是的,從理論上講,您應該能夠從良好的日志記錄實現中獲得此信息。 但是這些問題通常是由于無法控制的更改而在其他人的庫中深層隱患……或僅隱藏在大量當前正在執行的線程中。 如今的Java在調試模式下運行沒有太多開銷,通常,如果沒有附加調試器,我永遠不會運行我正在處理的任何事情,因為HotSwap極大地提高了生產率。
我很想知道其他人必須有斷點。 它們應該是您想立即知道的,在應用程序的正常運行中永遠都不會出現的故障。
死鎖檢測
VM在識別底層Java合約中的死鎖方面越來越好,調試器應該可以選擇打破死鎖。 您應確保默認情況下已將其打開。
在java.lang.ExceptionInInitializer上
進行跟蹤可能會很痛苦,因為在更深的一層它可能會變成ClassNotFoundException,并且通常,如果下降了多個級別,則沒有明顯的原因可以使間接引用類無法加載。
通常是由于人們使用引發RuntimeExceptions的方法/構造函數初始化公共/最終/靜態變量。 如果不確定使用帶有正確錯誤處理的static {}塊,請不要在其中執行依賴于當前jar文件外部內容的操作。
在java.lang.NoClassDefFoundError上
在OSGi中工作時總是很流行,通常您忘記了一個依賴的jar文件,并且看到這種類型的故障。 有趣的是,有時您只會在特定類的第一次拋出此異常時才找到原因。 因此,如果您有斷點,則可以更快地進行跟蹤。
我發現有時候在一些反射代碼后面沒有碰到斷點。 在那種情況下,我經常在此類的構造函數中有斷點以確保。
在java.lang.NoSuchMethodError上
如果您在本地未正確構建,或者使用的是錯配版本的庫,那么您當然通常會看到此信息。 您總是想知道這一點。
在java.lang.LinkageError上
通常,只有在情況確實變糟時才出現這種情況,例如,當您掛起同一個類的兩個版本,即使它們來自同一個jar文件時。 (必須愛多級裝載機)值得慶幸的是,這些裝載機不會經常出現,通常會在我已經非常頭痛的時候進行。
關于java.lang.OutOfMemoryError / java.lang.StackOverflowException
如果您很幸運,VM會為此中斷。 但是不幸的是,在本機代碼中會發生很多時間,您只需要處理這些后果。
為后者獲取完整的堆棧有點麻煩; 但并非不可能。 有關獲取完整堆棧跟蹤的信息,請參見此較早的文章。
在java.lang.AssertionError上
數量驚人的人使用斷言,然后在調試或運行測試時抱怨異常時感到不高興。 (您正在使用-ea執行此操作,對嗎?)
缺點是您想在調試某些測試框架時將其關閉,我正在查看您的JUnit,因為當您只想運行所有測試時碰到斷點并沒有完全幫助。
最后,我會不時地遍歷以下代碼,這將導致一個異常,僅用于測試是否啟用了斷言。
boolean assertionsEnabled = false;try{ assert false; }catch (AssertionException ae){ assertionsEnabled = true }更新:一位樂于助人的同事指出,我應該就應替換此代碼提供一些替代建議。 第一種選擇是調用Class.desiredAssertionStatus,但是如果您要完全確定,可以使用以下代碼,該代碼使用賦值來捕獲斷言狀態而不會引發異常。
boolean assertionsEnabled = false;assert isAssertionsEnabled = true; 參考: Gerard Davison博客博客中, 每個Java開發人員都應從我們的JCG合作伙伴 Gerard Davison獲得持久性斷點 。翻譯自: https://www.javacodegeeks.com/2013/05/persistent-breakpoints-every-java-developer-should-have.html
總結
以上是生活随笔為你收集整理的每个Java开发人员应拥有的持久断点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ddos如何防御(设置ddos防御)
- 下一篇: 爆料暗示微软 OneDrive 云存储服