Java 中的堆栈跟踪
在 Java 中,堆栈跟踪是一个堆栈数组。堆栈跟踪收集程序运行的所有方法的信息,并告诉我们控制台中异常或错误的位置。
当抛出异常或发生错误时,JVM 会自动显示堆栈跟踪。
本教程将演示什么是堆栈跟踪以及如何使用它来调试我们的代码。
演示 Java 中的堆栈跟踪
让我们运行一个简单的示例来显示 Java 中的堆栈跟踪,然后对其进行描述:
package delftstack;
public class Java_Stack_Trace {
public static void main(String args[]){
try {
String demo = null;
System.out.println(getString(demo));
}
catch(NullPointerException e) {
throw new IllegalStateException(e);
}
}
public static String getString(String demo) {
System.out.println(demo.toString());
return demo;
}
}
上面的代码运行一个方法来获取字符串,我们传递一个空字符串作为参数。我们尝试捕获空指针异常。
代码将捕获异常并显示跟踪。
输出:
Exception in thread "main" java.lang.IllegalStateException: java.lang.NullPointerException: Cannot invoke "String.toString()" because "demo" is null
at Delftstack/delftstack.Java_Stack_Trace.main(Java_Stack_Trace.java:10)
Caused by: java.lang.NullPointerException: Cannot invoke "String.toString()" because "demo" is null
at Delftstack/delftstack.Java_Stack_Trace.getString(Java_Stack_Trace.java:15)
at Delftstack/delftstack.Java_Stack_Trace.main(Java_Stack_Trace.java:7)
当代码抛出空指针异常时,输出显示堆栈跟踪。行号为 10 的最顶层方法调用是此异常的原因。
堆栈跟踪还告诉我们,由于字符串 demo
在第 7 行为空,因此引发了空点异常。下图进一步描述了此堆栈跟踪:
在 Java 中转储堆栈跟踪
堆栈跟踪包含包、类、方法和行的信息。Java 有一个内置函数 Thread.dumpStack()
来转储所有堆栈跟踪信息。
package delftstack;
public class Java_Stack_Trace {
public static void main(String args[]){
Stack_Trace_Demo();
}
static void Stack_Trace_Demo(){
Stack_Trace_Demo1();
}
static void Stack_Trace_Demo1(){
Stack_Trace_Demo2();
}
static void Stack_Trace_Demo2(){
Stack_Trace_Demo3();
}
static void Stack_Trace_Demo3(){
Stack_Trace_Demo4();
}
static void Stack_Trace_Demo4() {
Thread.dumpStack();
}
}
上面的代码包含四个演示方法,然后我们在最后一个方法中调用了 dumpstack()
。它将显示所有堆栈跟踪信息。
输出:
java.lang.Exception: Stack trace
at java.base/java.lang.Thread.dumpStack(Thread.java:1380)
at Delftstack/delftstack.Java_Stack_Trace.Stack_Trace_Demo4(Java_Stack_Trace.java:21)
at Delftstack/delftstack.Java_Stack_Trace.Stack_Trace_Demo3(Java_Stack_Trace.java:18)
at Delftstack/delftstack.Java_Stack_Trace.Stack_Trace_Demo2(Java_Stack_Trace.java:15)
at Delftstack/delftstack.Java_Stack_Trace.Stack_Trace_Demo1(Java_Stack_Trace.java:12)
at Delftstack/delftstack.Java_Stack_Trace.Stack_Trace_Demo(Java_Stack_Trace.java:9)
at Delftstack/delftstack.Java_Stack_Trace.main(Java_Stack_Trace.java:5)
这个堆栈也可以像上面图片中描述的那样描述。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布,任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站。本站所有源码与软件均为原作者提供,仅供学习和研究使用。如您对本站的相关版权有任何异议,或者认为侵犯了您的合法权益,请及时通知我们处理。