Java Exception.getMessage() 返回 -1

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”?

And*_*eas 5

异常名称通常是异常的一个非常重要的部分。有时它是唯一的例外。见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)