为什么我的 servlet 堆栈跟踪显示我的类的“未知来源”?

Why does my servlet stacktrace show "Unknown Source" for my classes?

提问人:zorlack 提问时间:6/3/2009 最后编辑:Benzorlack 更新时间:1/11/2012 访问量:8821

问:

我目前正在使用 Apache Tomcat 5.5.16 来提供基于 Lucene 的搜索 API。

最近,我的servlet类中有一些NullPointerExceptions。该类称为 。com.my_company.search.servlet.SearchServlet

对于某些类型的输入,我可以定期创建一个 NullPointerException,但我无法弄清楚它的确切位置。

StackTrace 指示此处发生错误:

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

此类的源文件和.class文件全部位于:

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

我的问题是,如何让 Tomcat 为我提供更多描述性的错误位置?

java 异常 servlet 堆栈跟踪 nullpointerexception

评论


答:

21赞 Adam Paynter 6/3/2009 #1

Tomcat 无法为您提供更详细的信息,除非相关类是使用调试信息编译的。如果没有此调试信息,JVM 就无法确定错误发生在哪一行代码上。

编辑:您可以通过在命令行上运行时指定选项来要求编译器包含此信息。您还可以使用 Javac Ant 任务的参数指定此选项。-gjavacdebug

评论

0赞 Pool 6/3/2009
+1,如果昨天讨论过使用 Eclipse 编译类似的 stackoverflow.com/questions/939194/......
0赞 Jared 6/3/2009
+1,并添加了注释,您可能需要考虑重构您的 doGet 方法 - 如果您的方法足够小并且执行的操作足够少,那么只需知道哪些输入为 null 以及它位于什么方法中就足够了。(但是,在启用调试的情况下进行编译绝对是解决当前问题的答案。
0赞 zorlack 6/3/2009
谢谢,这非常有帮助。我将debug=true添加到构建文件的javac部分,它运行良好。是的。毫无疑问,我需要重构我的 doGet =)
0赞 Salandur 6/3/2009 #2

当 JIT 编译器优化了您的类时,可能会出现未知源的位置。此时,源信息将丢失。若要获取原始位置,请重新启动服务器并重试测试。大多数情况下,您将在源中获得位置

4赞 cd1 6/3/2009 #3

您必须将调试信息添加到类中。使用以下选项编译它们:-g

javac -g YourServlet.java