第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

JVM怎么知道程序在哪一行拋出異常呢?

JVM怎么知道程序在哪一行拋出異常呢?

繁華開滿天機(jī) 2023-06-08 17:43:04
我想知道 JVM 是如何檢測(cè)崩潰的,具體來說,它是如何知道它在哪一行代碼上崩潰的。這是代碼的示例部分:import java.util.ArrayList;class Main {  public static void main(String[] args) {    ArrayList<String> crashMe = new ArrayList<String>(0);    crashMe.get(1);  }}這是崩潰消息(OpenJDK 10.0.2 通過repl.it):    Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 1 out of bounds for length 0    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)    at java.base/java.util.Objects.checkIndex(Objects.java:372)    at java.base/java.util.ArrayList.get(ArrayList.java:458)    at Main.main(Main.java:8)到目前為止所有預(yù)期的行為。但是 JVM 怎么知道我在第 8 行崩潰了呢?編譯java代碼時(shí)是否忽略新行等?為什么 jdk.internal 包甚至拋出異常,當(dāng)它們對(duì) JVM 開發(fā)人員以外的任何人都沒有用時(shí)?提前感謝任何能給我一些見解的人。
查看完整描述

1 回答

?
紫衣仙女

TA貢獻(xiàn)1839條經(jīng)驗(yàn) 獲得超15個(gè)贊

但是 JVM 怎么知道我在第 8 行崩潰了呢?


看一下構(gòu)造函數(shù)java.lang.Throwable:


public Throwable() {

    fillInStackTrace();

}

該fillInStackTrace方法使用在 JVM 本身中實(shí)現(xiàn)的本機(jī)代碼填充當(dāng)前堆棧跟蹤。堆棧跟蹤本身只是一個(gè) 數(shù)組StackTraceElement,每個(gè)數(shù)組都包含代碼路徑中的類、方法、文件名和行號(hào),我們可以通過它們創(chuàng)建異常。然后堆棧跟蹤存儲(chǔ)在Throwable實(shí)例中,稍后可以打印。


順便說一句,您可以創(chuàng)建一個(gè)Throwable并獲取其堆棧跟蹤,而無需實(shí)際拋出它。所以下面的代碼:


public class Foo {

    public static void main(String[] args) {

        Throwable t = new Throwable();

        for (StackTraceElement e : t.getStackTrace()) {

            System.out.println(e);

        }

        System.out.println("This is the end of main()");

    }

}

將打?。?/p>


Foo.main(Foo.java:4)

This is the end of main()

請(qǐng)注意,這This is the end of main()是打印出來的,因?yàn)槲覀儎倓倓?chuàng)建了一個(gè)異常。我們沒有扔掉它。這就是啟用從編譯代碼創(chuàng)建堆棧跟蹤的原因。


編譯java代碼時(shí)是否忽略新行等?


什么時(shí)候編譯?是的。創(chuàng)建堆棧跟蹤時(shí)?否。字節(jié)碼包含翻譯成該字節(jié)碼的源代碼指令的行號(hào)。


為什么 jdk.internal 包甚至拋出異常,當(dāng)它們對(duì) JVM 開發(fā)人員以外的任何人都沒有用時(shí)?


首先,JVM開發(fā)者也是人。他們應(yīng)該像其他人一樣有例外。


其次,您看到的異常似乎確實(shí)起源jdk.internal.util,但這只是因?yàn)锳rrayList使用“內(nèi)部”先決條件實(shí)用程序來檢查邊界。


查看完整回答
反對(duì) 回復(fù) 2023-06-08
  • 1 回答
  • 0 關(guān)注
  • 179 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)