为什么不能以下列方式抛出InterruptedException:
try {
System.in.wait(5) //Just an example
} catch (InterruptedException exception) {
exception.printStackTrace();
//On this next line I am confused as to why it will not let me throw the exception
throw exception;
}
我去了http://java24hours.com,但它没有告诉我为什么我不能抛出InterruptedException。
如果有人知道原因,请告诉我!我很绝望! :S
答案 0 :(得分:14)
如果您正在编写的方法声明它会抛出InterruptedException
(或基类),则只能抛出它。
例如:
public void valid() throws InterruptedException {
try {
System.in.wait(5) //Just an example
} catch (InterruptedException exception) {
exception.printStackTrace();
throw exception;
}
}
// Note the lack of a "throws" clause.
public void invalid() {
try {
System.in.wait(5) //Just an example
} catch (InterruptedException exception) {
exception.printStackTrace();
throw exception;
}
}
您应该阅读已检查的例外以获取更多详细信息。
(话虽如此,在wait()
上调用System.in
几乎肯定不会按照您的预期进行操作......)
答案 1 :(得分:3)
Java中有两种例外:已检查和未经检查例外。
对于已检查的异常,编译器会检查您的程序是否通过捕获它们或通过指定(使用throws
子句)指示可能发生异常的方法来处理它们,该方法可能会抛出该类型例外。
作为java.lang.RuntimeException
(和RuntimeException
本身)子类的异常类是未经检查的异常。对于这些异常,编译器不会进行检查 - 因此您不需要捕获它们或指定可能抛出它们。
类InterruptedException
是一个已检查的异常,因此您必须捕获它或声明您的方法可能会抛出它。您正在从catch
块中抛出异常,因此您必须指定您的方法可能抛出它:
public void invalid() throws InterruptedException {
// ...
扩展java.lang.Exception
(RuntimeException
和子类除外)的异常类是检查异常。
有关详细信息,请参阅Sun的Java Tutorial about exceptions。
答案 2 :(得分:0)
InterruptedException不是RuntimeException,因此必须捕获或检查它(在方法签名上使用throws子句)。您只能抛出一个RuntimeException而不是被编译器强制捕获它。