在任何NullPointerException消息中包含类名和变量名是否有用?我知道它可能并不总是可能的,因为JIT所做的更改似乎是经常可用的信息(班级成员等)。在任何NullPointerException消息中包含类名和变量名是否有用?
来源:http://jamesjava.blogspot.com/2005/04/what-was-null.html
在任何NullPointerException消息中包含类名和变量名是否有用?我知道它可能并不总是可能的,因为JIT所做的更改似乎是经常可用的信息(班级成员等)。在任何NullPointerException消息中包含类名和变量名是否有用?
来源:http://jamesjava.blogspot.com/2005/04/what-was-null.html
过程中的错误提供了尽可能多的信息可能是一件好事,对吧?
帮助追踪错误。
编辑:(是)
你扔NullPointerException
?我想你应该在代码中做null
验证。 我也会考虑使用开源记录工具,如Log4J
。
这取决于。如果你得到堆栈跟踪,很明显什么类抛出异常。这通常会导致确保你的环境会在没有出现异常时给你堆栈跟踪。
是的,这将是有益的。特别是如果您有一种机制,屏幕上显示错误消息(exception.getMessage()
),但实际的堆栈跟踪会隐藏在您无法立即访问的日志文件中。
不,我不认为这完全是“有用的”。
相反,你应该小心不要把NPE放在第一位。在使用它们之前检查您的值(null
验证)等。这应该发生在之前您调用库方法和之后您得到的结果(如果API指定该方法可能会返回null
。当然,有时它会这样做,但这是一个错误)。
如果您认为NPE应该携带此信息进行调试,请再考虑一下。这是调试器的优点。一个例外就是告诉你出了什么问题。请记住,未经检查的异常在运行时发生 - 必须在那里生成。为了知道哪个变量包含null
,字节代码必须知道变量名称。你不想用这样的东西来膨胀你的字节码。类名包含在我从我的程序中收到的每个日志输出中。这就是日志记录的好处。
Java通过为您提供行号和完整堆栈跟踪,已经大大简化了调试过程。 C程序因Segmentation fault
而失败。您必须使用strace
或调试器才能获得如此多的信息。
注意javac
确实包括编译时间选项,在编译时包含的源文件的信息,但是这是为了通过一个调试器一起使用,不是抛出随机例外。引用孙的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
长话短说:使用调试器。
在生产中具有难以复制的问题,实在不是一个好选项。 – 2008-10-14 17:06:51
堆栈跟踪通常只给你的行号,所以如果一个以上的对象是在该行引用你仍然不知道导致异常 – Thomas 2008-09-19 04:33:46