web-dev-qa-db-fra.com

Comment lire et comprendre la trace de pile Java?

Par exemple, j'ai une trace de pile comme ceci:

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)

Alors, quelle est la cause première de cette exception? À partir de la trace de la pile, j'ai découvert qu'il y avait un problème avec la fonction doFilter dans la classe OncePerRequestFilter! Cependant, lorsque je mets un point d'arrêt ici et que le programme ne s'arrête jamais à ce point d'arrêt.

Quelqu'un pourrait-il donner des explications à ce sujet!? Et en général, comment devrais-je utiliser ce cas de pile pour le débogage (lu de bas en haut ou de haut en bas)!

65
Toby D

Généralement, la raison exacte de Exception se trouve en première ligne de votre trace de pile. Pour plus d'informations sur la cause de cette exception, vous devez descendre progressivement et la cause première peut souvent être trouvée à proximité. le bas de la trace de la pile.

Mais dans la plupart des cas, vous pouvez même obtenir la cause de l'exception dès les premières lignes.

Donc, dans ce cas, votre exception est à la méthode handleRequest, et lorsque vous vous déplacez vers le bas, ce sont les méthodes qui ont appelé votre méthode précédente (celle située au-dessus de la méthode actuelle dans la trace de la pile).

46
Rohit Jain

Vous devriez généralement lire en commençant par le haut. Dans ce cas, il existe donc une exception NullPointerException à la ligne 66 de UnixServerJobController, dans la méthode handleRequest. Cette méthode a été appelée par SimpleControllerHandlerAdapter.handle, appelé par DispatcherServlet.doDispatch etc.

Cependant, dans ce cas particulier, il est probable que la première image de la trace de pile est tout ce dont vous avez besoin. Regardez la ligne 66 de UnixServerJobController, déterminez ce qui pourrait être nul et agissez en conséquence.

Notez que parfois une exception est encapsulée dans une autre (qui peut à son tour être encapsulée dans une autre, etc.). Dans ce cas, vous devriez regarder each des traces de la pile - il s’agit souvent de l’exception "la plus imbriquée" qui fournit les informations les plus utiles, car c’est la cause première.

68
Jon Skeet

Ce tutoriel pourrait éclairer votre problème et vous aider à mieux comprendre les choses.

Selon votre problème, il semble que vous ayez une exception Null Pointer Exception à la ligne 66 de la classe Unix Server Job Controller.

7
npinti
2
Toby D