iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >java如何定位异常堆栈中异常产生的位置
  • 821
分享到

java如何定位异常堆栈中异常产生的位置

java教程java 2016-07-05 16:07:32 821人浏览 无得
摘要

异常堆栈作为我们平时定位问题的最重要手段,为我们解决问题提供了很大帮助。但是我们可能都有这样的习惯就是看到一段异常,尤其是异常堆栈很多,层次很深的时候。就感觉很担心害怕,匆匆扫描一眼就开始猜问题应该如何如何,然后不断的根据猜测去调整代码,虽

异常堆栈作为我们平时定位问题的最重要手段,为我们解决问题提供了很大帮助。但是我们可能都有这样的习惯就是看到一段异常,尤其是异常堆栈很多,层次很深的时候。

就感觉很担心害怕,匆匆扫描一眼就开始猜问题应该如何如何,然后不断的根据猜测去调整代码,虽然也会debug但是还是浪费了不少的时间。

这是因为:

我们没有认认真真的看异常堆栈信息;

堆栈太多,我们并不确定到底哪里导致了问题。

解决办法就是:

知道异常堆栈产生的流程。

耐心的阅读堆栈信息。

解决问题

异常产生流程:上面报错,下面跟随

举个例子:我们有如下的测试代码

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.NullPointerException
	at 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包的代码。但是这并不影响我们去定位问题,我们还是根据上面报错,下面跟随来定位问题,那么真正报错的位置还是在上面。

那么我们只需要从上往下依次找我们自己的代码即可。第一个找到的我们的代码位置就是我们代码中引发报错的位置。有时候有些报错信息很明显,我们可以根据报错信息来直接定位到问题症结。

有时候报错信息并不能很明确的指明报错原因,这时候,我们就可以在这个精确的位置打上断点来调试一下。

--结束END--

本文标题: java如何定位异常堆栈中异常产生的位置

本文链接: https://www.lsjlt.com/news/2587.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作