Java getMessage()返回-1

Java getMessage()返回-1,java,debugging,exception,exception-handling,Java,Debugging,Exception,Exception Handling,我正在尝试调试一段生产代码。这不是我写的,所以请不要批评它。我知道这是一种糟糕的做法,原因有很多,如果可以的话,我会改变它,但我不能 代码如下所示: try { ... // Multiple lines of code that can throw exceptions ... } catch (Exception e) { System.out.println("Exception: " + e.getMessage()); } 在这些多行代码中,没有一行

我正在尝试调试一段生产代码。这不是我写的,所以请不要批评它。我知道这是一种糟糕的做法,原因有很多,如果可以的话,我会改变它,但我不能

代码如下所示:

try
{
    ...
    // Multiple lines of code that can throw exceptions
    ...
}

catch (Exception e)
{
    System.out.println("Exception: " + e.getMessage());
}
在这些多行代码中,没有一行是手动抛出的异常

尽管如此,以下是我试图调试的案例中打印的全部内容:

Exception: -1
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).
所有可以抛出异常的非本机库方法都在较大的try-catch块中调用的位置正确捕获。那么,具体地说,关于标准JDK中的异常,是否存在消息仅为-1的可能异常?

使用

e.printStackTrace()

您将看到异常抛出的位置以及原因。我猜它将是一个数组IndexOutOfBound异常

异常名称通常是异常的一个非常重要的部分。有时候这是唯一的例外。见以下文件的javadoc:

返回此可丢弃实例的详细消息字符串,该字符串可能为空

没有消息的异常示例:

因此,printlne.getMessage通常是没有意义的,因为它什么都不是,或者完全没有上下文

没有异常名称的消息无意义的异常示例: -1 foo.txt

始终包括异常名称,例如,使用:

字符串连接将自动使用toString,因此它也可以是:

System.out.println("Exception: " + e);
大多数情况下,最好打印stacktrace,以便您可以在代码中看到异常发生的位置:

e.printStackTrace(System.out);

这可能是一个ArrayIndexOutOfBoundsException。您可以使用e.printStackTrace来获取更多信息。@bubletan这似乎是一个非常好的猜测。Dude-您绝对需要使用getStackTrace,或者在调试器中重现问题并查看异常的stackTrace。在你这么做之前,你只是在猜测。猜测是不好的…@paulsm4我说我没有写代码。我打算在下一个版本中将堆栈跟踪打印出来,但这并不能在过渡期间解决问题。我能够找到异常,正如许多人猜测的那样,这确实是一个边界外的异常。由于他们的猜测,我能够确定是什么导致了这个bug,现在我能够始终如一地复制它。我完全了解printStackTrace,但是我不能修改代码,因为它是在生产环境中,我不知道如何在测试环境中重现异常。我确实认为你的猜测是正确的,而且可能是正确的。
e.printStackTrace(System.out);