在任何NullPointerException消息中包含类名和变量名是否有用?
在任何NullPointerException消息中包含类名和变量名是否有用?我知道,由于JIT所做的更改,并非总能做到这一点,但似乎信息应该经常可用(类成员等)。
来自:http://jamesjava.blogspot.com/2005/04/what-was-null.html
解决方案
在错误发生时提供尽可能多的信息是一件好事...对吗?
帮助跟踪错误。
编辑:(是)
你在抛出NullPointerException
吗?我认为我们可能应该在代码中执行" null"验证。
我还将考虑使用诸如Log4J之类的开源日志记录工具。
那要看。如果获得了堆栈跟踪,则很清楚是哪个类引发了异常。通常,这可以确保在有未处理的异常时,环境将为我们提供堆栈跟踪。
是的,这将很有用。尤其是如果我们具有一种机制,其中错误消息(exception.getMessage()
)在屏幕上显示,但是实际的堆栈跟踪信息被隐藏在无法立即访问的日志文件中。
不,我认为这根本不是"有用的"。
相反,我们应该当心不要将NPE放在首位。使用它们之前检查值(" null"验证)之类。这应该在调用库方法之前和返回结果之后发生(如果API指定该方法可能返回" null"。当然,有时无论如何都会这样做,但这是一个错误)。
如果我们认为NPE应该携带此信息进行调试,请再考虑一下。这就是调试器的优点。只是有一个例外来通知我们某些地方出了问题。请记住,未经检查的异常会在运行时发生,并且必须在此生成。为了使Exception知道哪个变量包含" null",字节码必须知道变量名称。我们不想用这样的东西to肿字节码。我从程序中收到的每个日志记录输出中都包含类名称。这就是日志记录的优点。
Java通过提供行号和完整的堆栈跟踪,已经大大简化了调试过程。 C程序因"分段错误"而失败。我们必须使用strace
或者调试器才能获得很多信息。
注意,javac
确实包含一个编译时选项,以在编译时包含源文件信息,但这是供调试器使用的,而不是抛出的随机Exception。引用Sun的javac
手册页:
-g Generate all debugging information, including local variables. By default, only line number and source file information is generated. -g:none Do not generate any debugging information. -g:{keyword list} Generate only some kinds of debugging information, specified by a comma separated list of keywords. Valid keywords are: source Source file debugging information lines Line number debugging information vars Local variable debugging information
长话短说:使用调试器。