14

为什么我在尝试抛出它们时需要用try/包装我抛出的自定义异常catch,但我不必为通用异常这样做?就像在示例中一样,我的Exception子类:

public class MyException extends Exception {
    public MyException(String msg) {
        super(msg);
    }
}

抛出异常:

public class Exe {

    private static void testex(String test) {
        if (null!=test) {
            throw new UnsupportedAddressTypeException();
        } else {//Removing try/catch block results in compile failure
          try {
            throw new MyException("message");
          } catch (MyException e) {
            e.printStackTrace();
          }
        }
    }
}
4

4 回答 4

17

UnsupportedAddressTypeException 是 RuntimeException 的子类,来自 JavaDoc:

RuntimeException 是可以在 Java 虚拟机正常运行期间抛出的那些异常的超类。

方法不需要在其 throws 子句中声明任何可能在方法执行期间抛出但未被捕获的 RuntimeException 子类。

于 2012-05-13T20:24:05.047 回答
12

如果您的异常扩展了 java.lang.Exception,您必须捕获它(或重新抛出)。如果它扩展了 java.lang.RuntimeException,则不需要这样做。您会发现所有标准异常也是如此。

编辑更改了单词must not to not required to

于 2012-05-13T20:22:11.423 回答
7

你的静态方法应该声明

private static void testex(String test) throws MyException

如果您希望该方法将其抛出(而不是在内部捕获和处理它)。

于 2012-05-13T20:21:11.703 回答
0

来自Java 教程

有效的 Java 编程语言代码必须遵守 Catch 或 Specify Requirement。这意味着可能引发某些异常的代码必须包含在以下任一内容中:

  • 捕获异常的 try 语句。try 必须为异常提供处理程序,如捕获和处理异常中所述。

  • 一种方法,指定它可以抛出异常。该方法必须提供列出异常的 throws 子句,如指定方法引发的异常中所述。

未能遵守 Catch 或 Specify Requirement 的代码将无法编译。并非所有例外都受“捕获或指定要求”的约束。

[...]

运行时异常不受捕获或指定要求的约束。运行时异常是由 RuntimeException 及其子类指示的异常。

于 2012-05-13T20:40:08.477 回答