如何阅读和理解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) 

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

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

一般来说, Exception的确切原因是在你的Stack Trace的第一行,关于exception原因的更多信息,你需要逐渐下移,根本原因通常可以在堆栈底部附近find跟踪。

但在大多数情况下,你甚至可以从头几行得到exception的原因..

所以,在这种情况下,你的exception是在handleRequest方法中,而当你向下移动的时候,那些方法调用了你以前的方法(在堆栈跟踪当前方法的上面)

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

但是,在这种情况下,堆栈跟踪的第一帧可能就是您所需要的。 看看UnixServerJobController第66 UnixServerJobController ,找出可能为空的东西,然后采取相应的行动。

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

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

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