Java根據(jù)控制臺實(shí)現(xiàn)定位異常
異常堆棧作為我們平時定位問題的最重要手段,為我們解決問題提供了很大幫助。但是我們可能都有這樣的習(xí)慣就是看到一段異常,尤其是異常堆棧很多,層次很深的時候。就感覺很擔(dān)心害怕,匆匆掃描一眼就開始猜問題應(yīng)該如何如何,然后不斷的根據(jù)猜測去調(diào)整代碼,雖然也會 debug 但是還是浪費(fèi)了不少的時間。
這是因?yàn)椋?/p>
1.我們沒有認(rèn)認(rèn)真真的看異常堆棧信息;
2.堆棧太多,我們并不確定到底哪里導(dǎo)致了問題。
解決辦法就是:
1.知道異常堆棧產(chǎn)生的流程。
2.耐心的閱讀堆棧信息。
3.解決問題
1.異常產(chǎn)生流程:上面報(bào)錯,下面跟隨
舉個例子:我們有如下的測試代碼:
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.NullPointerExceptionat 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),所以報(bào)錯的時候也是從被調(diào)用者最開始報(bào)錯,然后調(diào)用者依次報(bào)錯,所以打印錯誤時的順序也是報(bào)錯的位置在最上面,調(diào)用者依次向后排。
由此我們可以得出結(jié)論:上面報(bào)錯,下面跟隨。
2.讀懂報(bào)錯信息:尋找我們代碼報(bào)錯的位置
從上面的分析我們知道報(bào)錯位置在上面。
大部分情況下,最上方的報(bào)錯信息就是我們代碼出錯的位置。但是有時候最上方的日志并不是我們自己的代碼,那是因?yàn)槲覀兊拇a調(diào)用了一些三方 jar 包的代碼。但是這并不影響我們?nèi)ザㄎ粏栴},我們還是根據(jù)上面報(bào)錯,下面跟隨來定位問題,那么真正報(bào)錯的位置還是在上面。那么我們只需要從上往下依次找我們自己的代碼即可。
第一個找到的我們的代碼位置就是我們代碼中引發(fā)報(bào)錯的位置。有時候有些報(bào)錯信息很明顯,我們可以根據(jù)報(bào)錯信息來直接定位到問題癥結(jié)。有時候報(bào)錯信息并不能很明確的指明報(bào)錯原因,這時候,我們就可以在這個精確的位置打上斷點(diǎn)來調(diào)試一下。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 使用IDEA異常斷點(diǎn)來定位java.lang.ArrayStoreException的問題
- Java數(shù)組索引異常產(chǎn)生及解決方案
- java.lang.NullPointerException 如何處理空指針異常的實(shí)現(xiàn)
- JAVA項(xiàng)目常用異常處理匯總
- Java程序常見異常及處理匯總
- JavaWeb項(xiàng)目打開網(wǎng)頁出現(xiàn)Session Error的異常解決方案
- Java 異常java.lang.NoSuchFieldException解決方案
- 談?wù)凴xJava2中的異常及處理方法
- JAVA拋出異常的三種形式詳解
相關(guān)文章
淺談java 增強(qiáng)型的for循環(huán) for each
下面小編就為大家?guī)硪黄獪\談java 增強(qiáng)型的for循環(huán) for each。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10解決nacos啟動報(bào)錯Server check fail, please che
這篇文章主要介紹了nacos啟動 Server check fail, please check server localhost ,port 9848 is available的錯誤原因以及解決方法,需要的朋友可以參考下2023-09-09Java concurrency集合之 CopyOnWriteArrayList_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java concurrency集合之 CopyOnWriteArrayList的相關(guān)資料,需要的朋友可以參考下2017-06-06RabbitMq消息防丟失功能實(shí)現(xiàn)方式講解
這篇文章主要介紹了RabbitMq消息防丟失功能實(shí)現(xiàn),RabbitMQ中,消息丟失可以簡單的分為兩種:客戶端丟失和服務(wù)端丟失。針對這兩種消息丟失,RabbitMQ都給出了相應(yīng)的解決方案2023-01-01關(guān)于@OnetoMany關(guān)系映射的排序問題,使用注解@OrderBy
這篇文章主要介紹了關(guān)于@OnetoMany關(guān)系映射的排序問題,使用注解@OrderBy,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12使用IDEA搭建Hadoop開發(fā)環(huán)境的操作步驟(Window10為例)
經(jīng)過三次重裝,查閱無數(shù)資料后成功完成hadoop在win10上實(shí)現(xiàn)偽分布式集群,以及IDEA開發(fā)環(huán)境的搭建。一步一步跟著本文操作可以避免無數(shù)天坑2021-07-07java http連接池的實(shí)現(xiàn)方式(帶有失敗重試等高級功能)
這篇文章主要介紹了java http連接池的實(shí)現(xiàn)方式(帶有失敗重試等高級功能),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04