Jim*_*y P -3 java debugging exception-handling exception
我正在尝试调试一段生产代码。不是我写的,所以请不要批评它。我知道出于多种原因,这是一种糟糕的做法,如果可以,我会改变它,但我不能。
代码如下:
try
{
...
// Multiple lines of code that can throw exceptions
...
}
catch (Exception e)
{
System.out.println("Exception: " + e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
在这些多行代码中没有任何地方是手动抛出的异常。
尽管如此,以下是我尝试调试的情况下打印的全部内容:
Exception: -1
Run Code Online (Sandbox Code Playgroud)
Throwable.getMessage() 的 Java 文档说
getMessage
public String getMessage()
Returns the detail message string of this throwable.
Returns:
the detail message string of this Throwable instance (which may be null).
Run Code Online (Sandbox Code Playgroud)
所有可以抛出异常的非本地库方法都在更大的 try-catch 块中被调用的地方正确捕获。那么,特别是关于标准 JDK 中的异常,是否有任何可能的异常消息只是“-1”?
异常名称通常是异常的一个非常重要的部分。有时它是唯一的例外。见javadoc getMessage()
:
返回此 Throwable 实例的详细消息字符串(可能为 null)。
没有消息的异常示例:
NullPointerException
StackOverflowError
所以,println(e.getMessage())
通常是没有意义的,因为它什么都没有或完全没有上下文。
没有异常名称的消息没有意义的异常示例:
-1
ArrayIndexOutOfBoundsException
foo.txt
FileNotFoundException
也总是包含异常名称,例如使用toString()
:
System.out.println("Exception: " + e.toString());
Run Code Online (Sandbox Code Playgroud)
字符串连接将自动使用toString()
,因此它也可以只是:
System.out.println("Exception: " + e);
Run Code Online (Sandbox Code Playgroud)
在大多数情况下,最好是打印堆栈跟踪,所以你可以看到其中的代码发生异常:
e.printStackTrace(System.out);
Run Code Online (Sandbox Code Playgroud)