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