抛出异常

时间:2010-05-28 17:29:10

标签: java exception throw

为什么不能以下列方式抛出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

3 个答案:

答案 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.ExceptionRuntimeException和子类除外)的异常类是检查异常。

有关详细信息,请参阅Sun的Java Tutorial about exceptions

答案 2 :(得分:0)

InterruptedException不是RuntimeException,因此必须捕获或检查它(在方法签名上使用throws子句)。您只能抛出一个RuntimeException而不是被编译器强制捕获它。