Java,默认异常消息

Java, default exception messages

鉴于以下情况:

public abstract class Test {
    public static void main(String[] args) {
        int[] testArray = {6, 3, 2};
        System.out.println(testArray[3]);
    }
}

当我 运行 我得到的程序时:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
    at Test1.main(Test1.java:5)

在这种情况下,JVM 显示超出范围的索引,即 3。

抛开这个具体示例,考虑到我选择不捕获程序代码中的异常:

  1. 对于任何已检查或未检查的异常,我如何找出 JVM 显示的默认消息是什么?

  2. 对于我自己编写的自定义异常 class,以及我在代码中使用 'throw' 关键字生成的此 class 的对象(但是,再次选择不捕获),我可以设置 JVM 显示的默认消息吗?

Thread.setDefaultExceptionHandler,所有未捕获的异常都会放在那里,因此您可以在程序开头的某处提供您自己的异常处理程序作为该方法的参数。

我想,你也可以自己构造任意异常,看消息如下

new IOException().getMessage()

虽然在那种情况下消息可能会是空的,但我没有尝试

任何类型或扩展运行时异常的异常都是未经检查的异常。其余为检查异常。

你只需要扩展运行时异常然后你不需要处理抛出的异常。您可以通过 ovveriding getMessage 方法打印该异常的默认消息。

我只能回答你的第二个问题。 在您的异常 class(应该从 java.lang.Exception 派生)中添加(覆盖)接受字符串作为参数的构造函数。将您希望抛出的异常作为字符串传递给新的构造函数等消息 → 您会收到针对您的异常的个性化消息。如果您需要默认消息,只需在默认消息中使用此构造函数即可。希望对您有所帮助。

  1. How can I found out, for any exception, either checked or unchecked, what the default message would be that the JVM would display?

正如您可能已经猜到的那样,答案是 "in general, you can't"。大多数情况下,消息是从接受字符串消息的异常的构造函数之一设置的。如果幸运的话,该消息将很有意义并提供有用的信息。否则,按照惯例,异常的语义将主要存在于它的 class 名称和相关的 Javadoc 中。还要考虑异常消息通常是本地化的。

  1. For a custom exception class that I write myself, and for an object of this class that I generate in my code using the 'throw' keyword (but, again, choose not to catch it), can I set up a default message that the JVM would display?

这完全取决于您。您可以像这样在默认构造函数中设置默认消息:

public class MyException extends Exception {
  public MyException() {
    super("my default message");
  }

  public MyException(String message) {
    super(message);
  }
}