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

时间:2012-10-02 09:49:13

标签: 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)

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

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

4 个答案:

答案 0 :(得分:68)

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

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

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

答案 1 :(得分:43)

一般来说,Exception的确切原因位于Stack Trace的第一行,有关该异常原因的更多信息,您需要逐渐向下移动,并且通常可以找到根本原因靠近堆栈底部的某处。

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

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

答案 2 :(得分:7)

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

根据您的问题,您似乎在Unix服务器作业控制器类的第66行有一个Null Pointer Exception。

答案 3 :(得分:2)