如何阅读和理解java堆栈跟踪?

Tob*_*y D 67 java debugging exception stack-trace

例如,我有一个像这样的堆栈跟踪:

java.lang.NullPointerException
abc.investxa.presentation.controllers.UnixServerJobController.handleRequest(UnixServerJobController.java:66)
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
Run Code Online (Sandbox Code Playgroud)

那么这个例外的根本原因是什么?从堆栈跟踪中,我发现类中的doFilter函数存在问题OncePerRequestFilter!但是,当我在那里设置一个断点时,程序永远不会停在那个断点处.

谁能解释一下这个!?在一般情况下,我应该如何使用该堆栈案例进行调试(从下到上或从上到下阅读)!

Jon*_*eet 69

您通常应该从顶部读取 - 所以在这种情况下,在handleRequest方法中UnixServerJobController的第66行有一个NullPointerException .该方法被调用SimpleControllerHandlerAdapter.handle,被称为DispatcherServlet.doDispatch等.

但是,在这种特殊情况下,堆栈跟踪的第一帧可能就是您所需要的.查看第66行UnixServerJobController,找出可能为空的内容,并采取相应措施.

请注意,有时一个异常包含在另一个异常中(也可能包含在另一个异常中,等等).在这种情况下,您应该查看每个堆栈跟踪 - 通常它是"最嵌套"的异常,它提供了最有用的信息,因为这是根本原因.

  • "可能是堆栈跟踪的第一帧是你需要的所有",除非由于你提供了错误的参数集而引发了异常. (6认同)
  • 嗨乔恩,我一直很羡慕你.当你回答我的问题时,这很棒.:d (3认同)
  • 当异常被包装并重新抛出时,导入行[隐藏在中间](http://nurkiewicz.blogspot.no/2011/09/logging-exceptions-root-cause-first.html) (2认同)
  • @JanDvorak:我指的是这个特殊的堆栈跟踪 - 会更清楚. (2认同)

Roh*_*ain 49

一般来说,确切原因Exception是在堆栈跟踪的第一行,并且有关该异常原因的更多信息,您需要逐渐向下移动,并且通常可以在堆栈跟踪底部附近找到根本原因.

但在大多数情况下,您甚至可以从前几行获得异常原因.

因此,在这种情况下,您的异常是在handleRequest方法中,当您向下移动时,那些是调用您之前方法的方法(堆栈跟踪中当前方法之上的方法)

  • 在企业java中,调用堆栈的底部通常是库函数,并不值得研究. (8认同)
  • 从堆栈跟踪中可以看出,库中有9个堆栈帧,只有顶部框架是用户函数(可能会受到指责).通常情况是原因接近顶部. (4认同)

npi*_*nti 8

教程可能会对您的问题有所了解,并帮助您更好地理解问题.

根据您的问题,您似乎在Unix服务器作业控制器类的第66行有一个空指针异常.

  • 哦,太棒了,本教程是我正在寻找的,谢谢:D (2认同)