小編給大家分享一下java定位異常堆棧中異常產(chǎn)生位置的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
成都創(chuàng)新互聯(lián)公司始終堅持【策劃先行,效果至上】的經(jīng)營理念,通過多達(dá)10年累計超上千家客戶的網(wǎng)站建設(shè)總結(jié)了一套系統(tǒng)有效的網(wǎng)絡(luò)營銷推廣解決方案,現(xiàn)已廣泛運用于各行各業(yè)的客戶,其中包括:成都戶外休閑椅等企業(yè),備受客戶稱揚。
異常堆棧作為我們平時定位問題的最重要手段,為我們解決問題提供了很大幫助。但是我們可能都有這樣的習(xí)慣就是看到一段異常,尤其是異常堆棧很多,層次很深的時候。
就感覺很擔(dān)心害怕,匆匆掃描一眼就開始猜問題應(yīng)該如何如何,然后不斷的根據(jù)猜測去調(diào)整代碼,雖然也會debug但是還是浪費了不少的時間。
這是因為:
1.我們沒有認(rèn)認(rèn)真真的看異常堆棧信息;
2.堆棧太多,我們并不確定到底哪里導(dǎo)致了問題。
解決辦法就是:
1.知道異常堆棧產(chǎn)生的流程。
2.耐心的閱讀堆棧信息。
3.解決問題
1.異常產(chǎn)生流程:上面報錯,下面跟隨
舉個例子:我們有如下的測試代碼
package com.bsx.test; public class TestException { public static void main(String[] args) { TestException exception = new TestException(); exception.m1(); } public void m1() { m2(); } public void m2() { m3(); } public void m3() { String name = null; System.out.println(name.length()); } }
執(zhí)行之后輸出結(jié)果如下:
Exception in thread "main" java.lang.NullPointerException at com.bsx.test.TestException.m3(TestException.java:22) at com.bsx.test.TestException.m2(TestException.java:17) at com.bsx.test.TestException.m1(TestException.java:13) at com.bsx.test.TestException.main(TestException.java:9)
我們可以看到,這個錯誤日志輸出的順序跟調(diào)用順序是相反的,為什么呢?
我們知道java的方法在執(zhí)行的時候是在虛擬機(jī)棧中執(zhí)行的,每執(zhí)行一個方法就會新建一個棧幀然后壓入到虛擬機(jī)棧中。
這是一個后進(jìn)先出的結(jié)構(gòu),所以報錯的時候也是從被調(diào)用者最開始報錯,然后調(diào)用者依次報錯,所以打印錯誤時的順序也是報錯的位置在最上面,調(diào)用者依次向后排。由此我們可以得出結(jié)論:上面報錯,下面跟隨。
2.讀懂報錯信息:尋找我們代碼報錯的位置
從上面的分析我們知道報錯位置在上面。大部分情況下,最上方的報錯信息就是我們代碼出錯的位置。
但是有時候最上方的日志并不是我們自己的代碼,那是因為我們的代碼調(diào)用了一些三方j(luò)ar包的代碼。但是這并不影響我們?nèi)ザㄎ粏栴},我們還是根據(jù)上面報錯,下面跟隨來定位問題,那么真正報錯的位置還是在上面。
那么我們只需要從上往下依次找我們自己的代碼即可。第一個找到的我們的代碼位置就是我們代碼中引發(fā)報錯的位置。有時候有些報錯信息很明顯,我們可以根據(jù)報錯信息來直接定位到問題癥結(jié)。
有時候報錯信息并不能很明確的指明報錯原因,這時候,我們就可以在這個精確的位置打上斷點來調(diào)試一下。
以上是java定位異常堆棧中異常產(chǎn)生位置的方法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!