如何读取和理解 Java 堆栈跟踪?

例如,我得到了这样一个堆栈跟踪:

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)

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

有人能解释一下吗? 在一般情况下,我应该如何使用该堆栈案例进行调试(从底部到顶部或从顶部到底部读取) !

89296 次浏览

通常应该从上往下读——因此在本例中,在 UnixServerJobController 的第66行 handleRequest方法中有一个 NullPointerException。这个方法被 SimpleControllerHandlerAdapter.handle调用,DispatcherServlet.doDispatch调用等等。

但是,在这种特殊情况下,堆栈跟踪的第一帧很可能就是您所需要的全部内容。查看 UnixServerJobController的第66行,找出可能为 null 的值,并相应地执行操作。

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

一般来说,Exception的确切原因在堆栈跟踪的第一行,要获得关于异常原因的更多信息,需要逐渐向下移动,而根本原因通常可以在堆栈跟踪的底部附近找到。

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

因此,在本例中,异常位于 handleRequest方法,当向下移动时,异常位于调用前一个方法(堆栈跟踪中当前方法上面的方法)的方法

这个 教程可能会对你的问题有所启发,并帮助你更好地理解问题。

根据您的问题,在 Unix Server 作业控制器类的第66行似乎有一个 Null 指针异常。