如果某个方法引发未在方法声明中指定为“throws”的异常,会发生什么情况

2022-09-01 18:23:13

我从来没有使用过“throws”子句,今天一个伙伴告诉我,我必须在方法声明中指定该方法可能引发的异常。但是,我一直在使用异常而没有问题,但是,如果实际上需要它,为什么还需要它呢?


答案 1

Java 有两种不同类型的异常:选中的异常和未选中的异常。

未选中的异常是 的子类,您不必添加 throws 声明。所有其他异常都必须在方法主体中处理,使用 try/catch 语句或使用 throws 声明。RuntimeException

未经检查的异常示例:有时用于通知已使用非法参数调用方法。无需投掷。IllegalArgumentException

已检查异常的示例:包中的某些方法可能会引发。使用 try/catch 或添加到方法声明中,并将异常处理委托给方法调用方。IOExceptionjava.iothrows IOException


答案 2

如果使用 throws 关键字声明方法,则希望调用该方法的任何其他方法都必须准备好捕获它或声明自身将引发异常。

例如,如果要暂停应用程序,则必须调用Thread.sleep(milliseconds);

但是此方法的声明说它将抛出一个InterruptedException

声明:

public static void sleep(long millis) throws InterruptedException

因此,如果您希望在main方法中调用它,则必须捕获它:

public static void main(String args[]) {
    try {
        Thread.sleep(1000);
    } catch(InterruptedException ie) {
        System.out.println("Opps!");
    }
}

或者使该方法也声明它正在引发异常:

public static void main(String args[]) throws InterruptedException {
    Thread.sleep(1000);
}