gpt4 book ai didi

java - JVM怎么知道程序在哪一行抛出异常呢?

转载 作者:搜寻专家 更新时间:2023-11-01 01:59:18 25 4
gpt4 key购买 nike

我想知道 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 开发人员以外的任何人都没有用时?

提前感谢任何能给我一些见解的人。

最佳答案

But how does the JVM know that I am crashing on line 8?

看一下 java.lang.Throwable 的构造函数:

public Throwable() {
fillInStackTrace();
}

fillInStackTrace 方法使用在 JVM 本身中实现的 native 代码填充当前堆栈跟踪。堆栈跟踪本身只是一个 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()");
}
}

将打印:

Foo.main(Foo.java:4)
This is the end of main()

请注意 This is the end of main() 被打印出来,因为我们刚刚创建了一个异常。我们没有扔掉它。这就是从编译代码创建堆栈跟踪的原因。

Are new lines and such ignored when compiling java code?

什么时候编译?是的。创建堆栈跟踪时?不。字节码包含翻译成该字节码的源代码指令的行号。

Why does the jdk.internal package even bother throwing exceptions, when they are of no use to anyone but a JVM developer?

首先,JVM开发者也是人。他们应该像其他人一样有异常(exception)。

其次,您看到的异常似乎确实源自 jdk.internal.util,但这只是因为 ArrayList 使用“内部”前提条件实用程序来检查边界。

关于java - JVM怎么知道程序在哪一行抛出异常呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57523146/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com