亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

繁華開滿天機 2023-06-08 17:43:04
我想知道 JVM 是如何檢測崩潰的,具體來說,它是如何知道它在哪一行代碼上崩潰的。這是代碼的示例部分: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)到目前為止所有預期的行為。但是 JVM 怎么知道我在第 8 行崩潰了呢?編譯java代碼時是否忽略新行等?為什么 jdk.internal 包甚至拋出異常,當它們對 JVM 開發人員以外的任何人都沒有用時?提前感謝任何能給我一些見解的人。
查看完整描述

1 回答

?
紫衣仙女

TA貢獻1839條經驗 獲得超15個贊

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


看一下構造函數java.lang.Throwable:


public Throwable() {

    fillInStackTrace();

}

該fillInStackTrace方法使用在 JVM 本身中實現的本機代碼填充當前堆棧跟蹤。堆棧跟蹤本身只是一個 數組StackTraceElement,每個數組都包含代碼路徑中的類、方法、文件名和行號,我們可以通過它們創建異常。然后堆棧跟蹤存儲在Throwable實例中,稍后可以打印。


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


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()

請注意,這This is the end of main()是打印出來的,因為我們剛剛創建了一個異常。我們沒有扔掉它。這就是啟用從編譯代碼創建堆棧跟蹤的原因。


編譯java代碼時是否忽略新行等?


什么時候編譯?是的。創建堆棧跟蹤時?否。字節碼包含翻譯成該字節碼的源代碼指令的行號。


為什么 jdk.internal 包甚至拋出異常,當它們對 JVM 開發人員以外的任何人都沒有用時?


首先,JVM開發者也是人。他們應該像其他人一樣有例外。


其次,您看到的異常似乎確實起源jdk.internal.util,但這只是因為ArrayList使用“內部”先決條件實用程序來檢查邊界。


查看完整回答
反對 回復 2023-06-08
  • 1 回答
  • 0 關注
  • 181 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號