您好,登錄后才能下訂單哦!
小編給大家分享一下java定位異常堆棧中異常產(chǎn)生位置的方法,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
異常堆棧作為我們平時(shí)定位問(wèn)題的最重要手段,為我們解決問(wèn)題提供了很大幫助。但是我們可能都有這樣的習(xí)慣就是看到一段異常,尤其是異常堆棧很多,層次很深的時(shí)候。
就感覺(jué)很擔(dān)心害怕,匆匆掃描一眼就開(kāi)始猜問(wèn)題應(yīng)該如何如何,然后不斷的根據(jù)猜測(cè)去調(diào)整代碼,雖然也會(huì)debug但是還是浪費(fèi)了不少的時(shí)間。
這是因?yàn)椋?/strong>
1.我們沒(méi)有認(rèn)認(rèn)真真的看異常堆棧信息;
2.堆棧太多,我們并不確定到底哪里導(dǎo)致了問(wèn)題。
解決辦法就是:
1.知道異常堆棧產(chǎn)生的流程。
2.耐心的閱讀堆棧信息。
3.解決問(wèn)題
1.異常產(chǎn)生流程:上面報(bào)錯(cuò),下面跟隨
舉個(gè)例子:我們有如下的測(cè)試代碼
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)
我們可以看到,這個(gè)錯(cuò)誤日志輸出的順序跟調(diào)用順序是相反的,為什么呢?
我們知道java的方法在執(zhí)行的時(shí)候是在虛擬機(jī)棧中執(zhí)行的,每執(zhí)行一個(gè)方法就會(huì)新建一個(gè)棧幀然后壓入到虛擬機(jī)棧中。
這是一個(gè)后進(jìn)先出的結(jié)構(gòu),所以報(bào)錯(cuò)的時(shí)候也是從被調(diào)用者最開(kāi)始報(bào)錯(cuò),然后調(diào)用者依次報(bào)錯(cuò),所以打印錯(cuò)誤時(shí)的順序也是報(bào)錯(cuò)的位置在最上面,調(diào)用者依次向后排。由此我們可以得出結(jié)論:上面報(bào)錯(cuò),下面跟隨。
2.讀懂報(bào)錯(cuò)信息:尋找我們代碼報(bào)錯(cuò)的位置
從上面的分析我們知道報(bào)錯(cuò)位置在上面。大部分情況下,最上方的報(bào)錯(cuò)信息就是我們代碼出錯(cuò)的位置。
但是有時(shí)候最上方的日志并不是我們自己的代碼,那是因?yàn)槲覀兊拇a調(diào)用了一些三方j(luò)ar包的代碼。但是這并不影響我們?nèi)ザㄎ粏?wèn)題,我們還是根據(jù)上面報(bào)錯(cuò),下面跟隨來(lái)定位問(wèn)題,那么真正報(bào)錯(cuò)的位置還是在上面。
那么我們只需要從上往下依次找我們自己的代碼即可。第一個(gè)找到的我們的代碼位置就是我們代碼中引發(fā)報(bào)錯(cuò)的位置。有時(shí)候有些報(bào)錯(cuò)信息很明顯,我們可以根據(jù)報(bào)錯(cuò)信息來(lái)直接定位到問(wèn)題癥結(jié)。
有時(shí)候報(bào)錯(cuò)信息并不能很明確的指明報(bào)錯(cuò)原因,這時(shí)候,我們就可以在這個(gè)精確的位置打上斷點(diǎn)來(lái)調(diào)試一下。
以上是java定位異常堆棧中異常產(chǎn)生位置的方法的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。