在任何NullPointerException消息中包含类名和变量名是否有用?

时间:2020-03-06 14:24:33  来源:igfitidea点击:

在任何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

长话短说:使用调试器。