2009-06-03 9 views
8

Attualmente sto usando Apache Tomcat 5.5.16 per servire un'API di ricerca basata su Lucene.Perché la mia stacktrack servlet mostra "Sorgente sconosciuta" per le mie classi?

Ultimamente sto avendo alcune NullPointerExceptions all'interno della mia classe servlet. La classe si chiama com.my_company.search.servlet.SearchServlet.

Con determinati tipi di input, posso creare abitualmente una NullPointerException, ma non riesco a capire dove si trova esattamente.

Lo StackTrace indica che il bug è in corso qui:

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

Il file .class sorgente e per questa classe è tutto in:

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

La mia domanda è, come posso far sì che Tomcat mi fornisca percorsi di errore più descrittivi?

risposta

21

Tomcat non può fornire informazioni più dettagliate a meno che le classi in questione non siano state compilate con informazioni di debug. Senza queste informazioni di debug, la JVM non è in grado di determinare quale riga di codice si è verificato l'errore.

Edit: Si può chiedere al compilatore di includere queste informazioni specificando il -goption durante l'esecuzione javac sulla riga di comando. È inoltre possibile specificare questa opzione utilizzando il parametro debug dello Javac Ant task.

+0

+1, e se si utilizza Eclipse per compilare simile è stato discusso ieri http://stackoverflow.com/questions/939194/preserving-parameter-argument-names-in-compiled- java-classes – Pool

+0

+1, con il commento aggiunto che probabilmente dovresti pensare al refactoring del tuo metodo doGet - se i tuoi metodi sono abbastanza piccoli e sufficientemente piccoli, solo sapere quale input era nullo e quale metodo fosse probabilmente sarebbe sufficiente . (ma la compilazione con il debug attivato è sicuramente la risposta al tuo problema immediato). – Jared

+0

Grazie a questo è stato di grande aiuto. Ho aggiunto debug = true alla sezione javac del file build e ha funzionato perfettamente. E sì. Non c'è dubbio che ho bisogno di refactoring mio doGet =) – zorlack

0

l'origine sconosciuta della posizione può verificarsi quando il compilatore JIT ha ottimizzato la classe. A quel punto le informazioni sulla fonte vengono perse. per ottenere la posizione originale, riavviare il server e riprovare. La maggior parte delle volte si ottiene la posizione nella tua fonte

4

devi aggiungere informazioni di debug alle tue classi. li compilare con l'opzione -g:

javac -g YourServlet.java 
Problemi correlati