最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解讀Java報(bào)錯(cuò)輸出的信息究竟是什么

 更新時(shí)間:2024年12月25日 16:00:47   作者:高錳酸鉀_  
Java報(bào)錯(cuò)輸出的信息主要包括異常的主要描述信息和當(dāng)前線程的棧幀信息,棧幀是虛擬機(jī)棧的基本存儲(chǔ)單元,主要由局部變量表、操作數(shù)棧和幀數(shù)據(jù)三部分組成,局部變量表用于存放方法的參數(shù)和局部變量,操作數(shù)棧用于保存計(jì)算過程中產(chǎn)生的中間結(jié)果

Java報(bào)錯(cuò)輸出的信息究竟是什么?

本篇會(huì)帶大家了解一下java運(yùn)行時(shí)報(bào)錯(cuò)輸出的信息內(nèi)容,簡(jiǎn)單學(xué)習(xí)一下虛擬機(jī)內(nèi)存中Java虛擬機(jī)棧的工作方式以及棧幀中所存儲(chǔ)的信息內(nèi)容

異常信息

當(dāng)你的程序運(yùn)行報(bào)錯(cuò)時(shí),你是否會(huì)好奇打印出來的那一大坨紅色的究竟是什么?

首先,報(bào)錯(cuò)的第一行是異常的主要描述信息,那么剩下的基本都是當(dāng)前線程的棧幀信息

比如上圖對(duì)于異常的描述是

Access denied for user 'root'@'localhost' (using password: YES)

我們的數(shù)據(jù)庫(kù)訪問被拒絕了,原因就是我把密碼輸入錯(cuò)誤了

那么異常描述下面的信息就是棧幀信息了

什么是棧幀呢,棧幀中又包含了哪些信息?

虛擬機(jī)棧

在我們的Java虛擬機(jī)中,有一個(gè)組成部分叫做運(yùn)行時(shí)數(shù)據(jù)區(qū),它是程序執(zhí)行過程中用于存儲(chǔ)數(shù)據(jù)的內(nèi)存區(qū)域,這個(gè)區(qū)域用于存儲(chǔ)程序運(yùn)行過程中的各種數(shù)據(jù),包括對(duì)象實(shí)例、類信息、局部變量、方法調(diào)用信息等

在運(yùn)行時(shí)數(shù)據(jù)區(qū)中,又有一部分是虛擬機(jī)棧,每個(gè)線程都有一個(gè)獨(dú)立的虛擬機(jī)棧,當(dāng)方法被調(diào)用時(shí),會(huì)在棧中創(chuàng)建一個(gè)新的棧幀(Stack Frame),當(dāng)方法執(zhí)行完畢后,棧幀會(huì)被彈出,控制權(quán)回到調(diào)用方,所以虛擬機(jī)棧中進(jìn)進(jìn)出出的就是程序中的方法的棧幀

那么虛擬機(jī)棧是怎么運(yùn)行的呢

這里以一段代碼的運(yùn)行為例子:

public class Stark {
    public static void main(String[] args) {
        FunctionA();
    }
    public static void FunctionA(){
        System.out.println("運(yùn)行了A");
        FunctionB();
    }
    public static void FunctionB(){
        System.out.println("運(yùn)行了B");
    }
}

當(dāng)我們運(yùn)行這段程序時(shí),第一個(gè)執(zhí)行的是Main方法,在Main方法中又調(diào)用執(zhí)行了A方法,在A方法中又執(zhí)行了B方法,那么在虛擬機(jī)棧中,要執(zhí)行的方法的棧幀會(huì)進(jìn)入虛擬機(jī)棧中,待方法完全執(zhí)行完畢后,他的棧幀才會(huì)被彈出:

此時(shí),三個(gè)方法都還沒有完全結(jié)束,當(dāng)B方法被調(diào)用,輸出"運(yùn)行了B"后,B方法的棧幀才會(huì)彈出虛擬機(jī)棧,以此類推:

這就是虛擬機(jī)棧的運(yùn)行過程,我們也可以在IDEA中使用斷點(diǎn)調(diào)試查看到線程的虛擬機(jī)棧,依然使用上面的代碼,在B方法上打斷點(diǎn),點(diǎn)擊調(diào)試運(yùn)行:

在左下角就可以看到目前存在的線程中的棧中有哪些棧幀:

此時(shí)正處于B方法中,也就是上圖中A方法剛剛調(diào)用的B方法,B方法還未結(jié)束時(shí),棧中有三個(gè)方法的棧幀信息

文章開頭提到,報(bào)錯(cuò)時(shí)會(huì)輸出當(dāng)前線程全部的棧幀信息,我們可以試一下

在上述代碼的B方法中添加一句拋出異常的代碼:

public class Stark {
    public static void main(String[] args) {
        FunctionA();
    }
    public static void FunctionA(){
        System.out.println("運(yùn)行了A");
        FunctionB();
    }
    public static void FunctionB(){
        System.out.println("運(yùn)行了B");
        throw new RuntimeException("出錯(cuò)");
    }
}

執(zhí)行代碼,你可以在控制臺(tái)看到打印出了如下內(nèi)容:

在報(bào)錯(cuò)信息的第一行顯示,我們?cè)诰€程mian中發(fā)生了運(yùn)行時(shí)異常,異常信息:“出錯(cuò)”

接著,很顯然下面的部分就是棧幀信息,他的打印順序就是當(dāng)前虛擬機(jī)棧中的全部棧幀依次打印

什么是棧幀

相信看到這里,你會(huì)發(fā)出疑問,什么是棧幀呢?虛擬機(jī)棧中放入的棧幀到底是個(gè)什么東西呢?

棧幀是虛擬機(jī)棧的基本存儲(chǔ)單元,主要是由三部分組成:

  • 局部變量表:
    用于存放方法的參數(shù)和局部變量。這些變量在方法執(zhí)行過程中會(huì)被頻繁訪問,因此將它們存儲(chǔ)在棧幀中可以提高訪問速度。局部變量表中的變量在方法調(diào)用時(shí)初始化,并在方法執(zhí)行完畢后銷毀
  • 操作數(shù)棧:
    用于保存計(jì)算過程中產(chǎn)生的中間結(jié)果和作為計(jì)算單元的操作數(shù)。操作數(shù)棧是一個(gè)后進(jìn)先出(LIFO)的數(shù)據(jù)結(jié)構(gòu),與局部變量表一起支持方法的執(zhí)行。
  • 幀數(shù)據(jù):
    主要包含動(dòng)態(tài)鏈接、方法出口、異常表等信息

局部變量表

我們編譯StarkTest類并查看他的字節(jié)碼文件:

public class StarkTest {
    public static void main(String[] args) {
        int i = 0;
        int j = i + 1;
    }
}

打開方法,找到Mian方法下的LocalVariableTable就是局部變量表,表中會(huì)把方法中的參數(shù)和局部變量存放起來,索引從0開始,由于我們的main方法傳入了參數(shù)args,那么表中下標(biāo)為0的槽中放了args,方法中我們又聲明了i,和j,那么他們會(huì)依次保存到槽中

其實(shí)局部變量表就是一個(gè)數(shù)組,每一個(gè)位置被稱為一個(gè)槽,除了long類型和double類型的變量要占兩個(gè)槽,其余的都只占一個(gè)槽,需要注意的是如果該方法不是靜態(tài)方法而是示例方法,該方法運(yùn)行時(shí)局部變量表的第一個(gè)槽會(huì)存放調(diào)用該方法的實(shí)例對(duì)象,也就是this

局部變量表中存放的變量如果在其生效范圍內(nèi)不會(huì)在被使用,那么之后的變量或是參數(shù)就可以覆蓋他的槽,以此節(jié)省空間

操作數(shù)棧

他就是一塊用來存放運(yùn)行時(shí)中間數(shù)據(jù)的區(qū)域,比如上邊代碼中int i = 0;int j = i + 1;這兩行代碼執(zhí)行的過程,先把0放入操作數(shù)棧中,再將操作數(shù)棧中的數(shù)賦值給變量i,然后把i的值放入操作數(shù)棧中,再把1也放入操作數(shù)棧中,讓操作數(shù)棧中的兩個(gè)數(shù)相加,再賦值給變量j:

幀數(shù)據(jù)

幀數(shù)據(jù)中主要是動(dòng)態(tài)鏈接,方法出口

  • 動(dòng)態(tài)鏈接:
    用于維護(hù)方法調(diào)用時(shí)的符號(hào)引用轉(zhuǎn)化為直接引用的信息。在Java中,每個(gè)類都有一個(gè)常量池,用于存儲(chǔ)符號(hào)引用。當(dāng)方法被調(diào)用時(shí),JVM會(huì)通過動(dòng)態(tài)鏈接將符號(hào)引用轉(zhuǎn)化為直接引用,以便在方法執(zhí)行過程中訪問其他類或方法。
  • 方法出口:
    記錄方法正常退出或異常退出時(shí)的處理信息。當(dāng)方法執(zhí)行完畢后,JVM會(huì)根據(jù)方法出口的信息將控制權(quán)返回給調(diào)用者。如果方法在執(zhí)行過程中拋出異常,JVM也會(huì)根據(jù)方法出口的信息來處理異常

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot實(shí)現(xiàn)上傳并解析Excel過程解析

    springboot實(shí)現(xiàn)上傳并解析Excel過程解析

    這篇文章主要介紹了springboot實(shí)現(xiàn)上傳并解析Excel過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Spring AOP原理解析

    Spring AOP原理解析

    AOP面向切片編程思想,是一種對(duì)一類問題集中處理的思想,Spring AOP就是為了解決這些問題存在,是AOP思想的其中一種實(shí)現(xiàn)方式,下面給大家詳細(xì)介紹Spring AOP原理解析,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • Java實(shí)現(xiàn)批量下載文件的示例代碼

    Java實(shí)現(xiàn)批量下載文件的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)批量下載文件,并以壓縮輸出流的形式返回前端,文中的示例代碼講解詳細(xì),需要的小伙伴可以參考一下
    2023-10-10
  • java servlet手機(jī)app訪問接口(一)數(shù)據(jù)加密傳輸驗(yàn)證

    java servlet手機(jī)app訪問接口(一)數(shù)據(jù)加密傳輸驗(yàn)證

    這篇文章主要為大家詳細(xì)介紹了java servlet手機(jī)app訪問接口(一),數(shù)據(jù)加密傳輸驗(yàn)證,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Java網(wǎng)絡(luò)編程之TCP程序設(shè)計(jì)

    Java網(wǎng)絡(luò)編程之TCP程序設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了Java網(wǎng)絡(luò)編程之TCP程序設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • SpringBoot實(shí)現(xiàn)多端口監(jiān)聽的代碼示例

    SpringBoot實(shí)現(xiàn)多端口監(jiān)聽的代碼示例

    當(dāng)你需要在同一個(gè)Spring Boot應(yīng)用中,通過不同的端口來提供不同的服務(wù)或功能時(shí),就需要實(shí)現(xiàn)多端口監(jiān)聽,所以本文給大家介紹了SpringBoot實(shí)現(xiàn)多端口監(jiān)聽的方法示例,并有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-09-09
  • MyBatis如何進(jìn)行雙重foreach循環(huán)

    MyBatis如何進(jìn)行雙重foreach循環(huán)

    這篇文章主要介紹了MyBatis如何進(jìn)行雙重foreach循環(huán),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • Java自學(xué)書籍Top 10

    Java自學(xué)書籍Top 10

    這篇文章主要為大家推薦了Java書籍Top 10,是由Java Inside推薦的十本不錯(cuò)的Java書籍,感興趣的小伙伴們可以參考一下
    2016-09-09
  • Java開發(fā)到底為什么要用 IoC 和 AOP

    Java開發(fā)到底為什么要用 IoC 和 AOP

    這篇文章主要介紹了Java開發(fā)到底為什么要用 IoC 和 AOP,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-02-02
  • PostMan傳@RequestParam修飾的數(shù)組方式

    PostMan傳@RequestParam修飾的數(shù)組方式

    這篇文章主要介紹了PostMan傳@RequestParam修飾的數(shù)組方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08

最新評(píng)論

拜城县| 盐源县| 盘山县| 麻城市| 乌鲁木齐市| 同心县| 宁德市| 丹东市| 昭通市| 霍邱县| 民和| 惠水县| 类乌齐县| 潼关县| 德化县| 两当县| 天柱县| 芮城县| 大悟县| 南江县| 潍坊市| 湖州市| 深圳市| 泾阳县| 五峰| 昌宁县| 临城县| 民权县| 中西区| 东莞市| 桑植县| 湖南省| 绥芬河市| 册亨县| 年辖:市辖区| 桂东县| 隆尧县| 那坡县| 平陆县| 邵阳县| 南华县|