2015-05-30 55 views
4

考虑以下几点:Java中,默认的异常消息

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. 对于我自己编写的自定义异常类,以及在我的代码中使用'throw'关键字生成的此类的对象(但是,再次选择不捕获),我可以设置一个JVM将显示的默认消息?

回答

5
  1. 我怎样才能发现,对任何异常,选中或未选中,默认的消息会是怎样的JVM会 显示?

正如你可能已经怀疑的那样,答案是“一般来说,你不能”。大多数情况下,消息是从接受字符串消息的异常的构造函数之一中设置的。如果你幸运的话,该信息将是有意义的,并提供有用的信息。否则,就像通常的做法那样,异常的语义本质上将存在于它的类名和关联的Javadoc中。还要考虑异常消息通常是本地化的。

  • 对于我写自己,并且为此类,我在使用“掷”关键字 我的代码生成(但同样的对象的自定义异常类,选择不要捕捉它),我可以设置JVM将显示的默认消息 ?
  • 这完全取决于你。您可以在默认构造函数中设置默认消息,如下所示:

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

    Thread.setDefaultExceptionHandler,所有捕获的异常会去那里,所以你可以提供自己的异常处理程序,在程序开头的某处一个参数传递给该方法。

    我想,你也可以自己构造的任何异常并看到信息如下

    new IOException().getMessage() 
    

    虽然可能在这种情况下,该消息将是空的,我没有尝试

    1

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

    你只需要扩展运行时异常,那么你不需要处理抛出的异常。您可以通过替代getMessage方法来打印该例外的默认消息。

    3

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