8

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

4

3 回答 3

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没有按照您的预期进行......)

于 2010-05-28T17:31:28.463 回答
3

Java中有两种异常:已检查异常和未检查异常。

对于已检查的异常,编译器会检查您的程序是否处理它们,方法是捕获它们或指定(使用throws子句)可能发生异常的方法,该方法可能会抛出这种异常。

java.lang.RuntimeException作为(及其RuntimeException本身)子类的异常类是未经检查的异常。对于这些异常,编译器不会进行检查 - 因此您不需要捕获它们或指定您可能会抛出它们。

InterruptedException是一个检查异常,因此您必须捕获它或声明您的方法可能会抛出它。您正在从catch块中抛出异常,因此您必须指定您的方法可能会抛出它:

public void invalid() throws InterruptedException {
    // ...

扩展的异常类java.lang.Exception(除了RuntimeException和子类)是检查异常。

有关详细信息,请参阅 Sun 的Java 教程中的异常

于 2010-05-28T17:39:53.453 回答
0

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

于 2010-05-28T17:33:33.250 回答