时间:2021-05-20
异常堆栈作为我们平时定位问题的最重要手段,为我们解决问题提供了很大帮助。但是我们可能都有这样的习惯就是看到一段异常,尤其是异常堆栈很多,层次很深的时候。就感觉很担心害怕,匆匆扫描一眼就开始猜问题应该如何如何,然后不断的根据猜测去调整代码,虽然也会 debug 但是还是浪费了不少的时间。
这是因为:
1.我们没有认认真真的看异常堆栈信息;
2.堆栈太多,我们并不确定到底哪里导致了问题。
解决办法就是:
1.知道异常堆栈产生的流程。
2.耐心的阅读堆栈信息。
3.解决问题
1.异常产生流程:上面报错,下面跟随
举个例子:我们有如下的测试代码:
package com.bsx.test;public class TestException { public static void main(String[] args) { TestException exception = new TestException(); exception.m1(); } public void m1() { m2(); } public void m2() { m3(); } public void m3() { String name = null; System.out.println(name.length()); }}执行之后输出结果如下:
Exception in thread "main" java.lang.NullPointerExceptionat com.bsx.test.TestException.m3(TestException.java:22)at com.bsx.test.TestException.m2(TestException.java:17)at com.bsx.test.TestException.m1(TestException.java:13)at com.bsx.test.TestException.main(TestException.java:9)
我们可以看到,这个错误日志输出的顺序跟调用顺序是相反的,为什么呢?
我们知道 java 的方法在执行的时候是在虚拟机栈中执行的,每执行一个方法就会新建一个栈帧然后压入到虚拟机栈中。这是一个后进先出的结构,所以报错的时候也是从被调用者最开始报错,然后调用者依次报错,所以打印错误时的顺序也是报错的位置在最上面,调用者依次向后排。
由此我们可以得出结论:上面报错,下面跟随。
2.读懂报错信息:寻找我们代码报错的位置
从上面的分析我们知道报错位置在上面。
大部分情况下,最上方的报错信息就是我们代码出错的位置。但是有时候最上方的日志并不是我们自己的代码,那是因为我们的代码调用了一些三方 jar 包的代码。但是这并不影响我们去定位问题,我们还是根据上面报错,下面跟随来定位问题,那么真正报错的位置还是在上面。那么我们只需要从上往下依次找我们自己的代码即可。
第一个找到的我们的代码位置就是我们代码中引发报错的位置。有时候有些报错信息很明显,我们可以根据报错信息来直接定位到问题症结。有时候报错信息并不能很明确的指明报错原因,这时候,我们就可以在这个精确的位置打上断点来调试一下。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文介绍的是利用java语言实现一个控制台版的模拟借书系统,在开始本文的正式内容之前,我们先来了解一下Java异常机制。什么是异常?异常,不正常也。Except
本文介绍的是利用java编写一个控制台版的“达达租车系统”,下面话不多说了,来看看详细实现方法吧。实现目标java编写一个控制台版的“达达租车系统”实现功能1.
java从控制台接收一个数字的实例详解功能:从控制台接收一个数实现代码:importjava.io.*;//引入一个IO流的包publicclasshellow
本文实例为大家分享了Java控制台实现猜拳游戏的具体代码,供大家参考,具体内容如下1、目标通过控制台实现一个人机对战的猜拳游戏,用户通过输入(1.剪刀2.石头3
如下图所示,IntellijIDEA显示中文为乱码,根据IntellijIDEA控制台输出,TomcatLog出现乱码,因此可以将问题定位到Tomcat上,具体