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

2022-08-31 13:29:15

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

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)

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

任何人都可以对此做出解释!?在一般情况下,我应该如何使用该堆栈案例进行调试(从底部到顶部或从顶部到底部读取)!


答案 1

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

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

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


答案 2

通常,确切的原因位于堆栈跟踪的第一行,有关该异常原因的详细信息,您需要逐步向下移动,并且根本原因通常可以在堆栈跟踪底部附近的某个位置找到。Exception

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

因此,在本例中,您的异常是 at method,当您向下移动时,这些方法是调用您以前的方法的方法(堆栈跟踪中当前方法上方的方法)handleRequest