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使用“內部”先決條件實用程序來檢查邊界。
添加回答
舉報