2009-06-03 2 views
8

J'utilise actuellement Apache Tomcat 5.5.16 pour servir une API de recherche Lucene. Dernièrement, j'ai eu quelques NullPointerExceptions dans ma classe de servlets. La classe s'appelle com.my_company.search.servlet.SearchServlet.Pourquoi la piletrace de ma servlet affiche-t-elle "Unknown Source" pour mes cours?

Avec certains types d'entrées, je peux régulièrement créer une exception NullPointerException, mais je n'arrive pas à déterminer exactement où elle se trouve.

Le StackTrace indique que le bug est INTERVENUES ici:

com.my_company.search.servlet.SearchServlet.doGet(Unknown Source)

La source et les fichiers .class pour cette classe est dans:

$TOMCAT_HOME/webapps/my_servlet/WEB-INF/classes/com/my_company/search/servlet/

Ma question est, comment puis-je demander à Tomcat de me fournir des emplacements d'erreur plus descriptifs?

Répondre

21

Tomcat ne peut pas vous fournir d'informations plus détaillées à moins que les classes en question aient été compilées avec des informations de débogage. Sans ces informations de débogage, la machine virtuelle Java ne peut pas déterminer la ligne de code sur laquelle l'erreur s'est produite.

Edit: Vous pouvez demander au compilateur d'inclure ces informations en spécifiant le -goption lors de l'exécution javac sur la ligne de commande. Vous pouvez également spécifier cette option à l'aide du paramètre debug du Javac Ant task.

+0

+1, et si vous utilisez Eclipse pour compiler similaire a été discuté hier http://stackoverflow.com/questions/939194/preserving-parameter-argument-names-in-compiled- java-classes – Pool

+0

+1, avec le commentaire ajouté que vous avez probablement besoin de réfléchir à refactoriser votre méthode doGet - si vos méthodes sont assez petites et font assez peu, juste savoir quelle entrée était nulle et quelle méthode elle était probablement suffisante . (mais la compilation avec le débogage activé est certainement la réponse à votre problème immédiat.) – Jared

+0

Merci, c'était extrêmement utile. J'ai ajouté debug = true à la section javac du fichier de construction et cela a parfaitement fonctionné. Et oui. Il n'y a pas de question que j'ai besoin de refactoriser mon doGet =) – zorlack

0

La source de localisation inconnue peut se produire lorsque le compilateur JIT a optimisé votre classe. À ce stade, les informations sur la source sont perdues. pour obtenir l'emplacement d'origine, redémarrez le serveur et réessayez votre test. La plupart du temps vous obtiendrez l'emplacement dans votre source

4

vous devez ajouter des informations de débogage à vos classes. les compiler avec l'option -g:

javac -g YourServlet.java 
Questions connexes