1

在任何 NullPointerException 消息中包含类名和变量名是否有用?我知道由于 JIT 所做的更改,它可能并不总是可能的,但似乎信息应该经常可用(班级成员等)。

来自:http: //jamesjava.blogspot.com/2005/04/what-was-null.html

4

5 回答 5

2

那要看。如果您获得堆栈跟踪,则很清楚是哪个类引发了异常。这通常会确保您的环境在出现未处理的异常时为您提供堆栈跟踪。

于 2008-09-19T03:41:52.740 回答
1

在错误期间提供尽可能多的信息是一件好事……对吗?

帮助跟踪错误。

编辑:(是的)

于 2008-09-19T03:36:53.453 回答
0

不,我认为这根本不会“有用”。

相反,您应该注意不要一开始就抛出 NPE。在使用它们之前检查您的值(null验证)等。这应该调用库方法之前和返回结果之后发生(如果 API 指定该方法可能返回null。当然,有时它无论如何都会这样做,但那是一个错误)。

如果您认为 NPE 应该携带此信息进行调试,请再想一想。这就是调试器的好处。一个例外只是通知您出了问题。请记住,未经检查的异常发生在运行时 - 并且必须在那里生成。为了让异常知道包含哪个变量null字节 必须知道变量名。你不想用这样的东西来膨胀你的字节码。类名包含在我从程序收到的每个日志输出中。这就是日志记录的好处。

Java 通过为您提供行号和完整的堆栈跟踪已经大大简化了调试过程。C 程序以Segmentation fault. 您必须使用strace或调试器才能获得如此多的信息。

请注意,它javac 确实包含一个编译时选项以在编译时包含源文件信息,但这旨在由调试器使用,而不是被抛出的随机异常。引用 Sun 的javac手册页:

             -g 生成所有调试信息,包括局部变量。
                默认只有行号和源文件信息
                生成。

             -g:无
                不要生成任何调试信息。

             -g:{关键字列表}
                仅生成某些类型的调试信息,指定
                通过逗号分隔的关键字列表。有效的关键字是:

                资源
源文件调试信息 线条 行号调试信息 变量 局部变量调试信息

长话短说:使用调试器。

于 2008-09-19T08:38:14.197 回答
0

是的,那会很有用。特别是如果您有一种机制,错误消息 ( exception.getMessage()) 会显示在屏幕上,但实际的堆栈跟踪会隐藏在您无法立即访问的日志文件中。

于 2008-09-19T04:02:11.287 回答
-1

你在扔NullPointerException吗?我认为您可能应该null在代码中进行验证。我还会考虑使用开源日志工具,例如Log4J.

于 2008-09-19T03:41:30.540 回答