73

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

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

4 回答 4

76

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

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

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

于 2012-10-02T09:51:25.043 回答
55

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

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

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

于 2012-10-02T09:52:29.810 回答
11

教程可能会阐明您的问题并帮助您更好地理解事物。

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

于 2012-10-02T09:52:29.990 回答
2

我发现本教程对我非常有用 https://forums.bukkit.org/threads/how-to-read-stack-traces-and-troubleshoot-your-own-plugins-by-yourself.32457/

于 2013-07-03T03:04:22.143 回答