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í)用程序來檢查邊界。
添加回答
舉報(bào)