抛出已检查的异常

时间:2011-06-10 04:37:47

标签: java exception exception-handling checked-exceptions

我在Java中的一些方法会抛出异常,例如NoSuchElementException,IllegalArgumentException等。但是在使用这些方法时,这些异常似乎未经检查。换句话说,我的方法的调用者不需要对抛出这些异常的方法执行try / catch。我读到它似乎默认情况下“异常”被“检查”,只有错误是“未选中”。但不知何故,我抛出的异常也未经检查。这很奇怪。

如何在我的方法抛出异常时确保调用者必须在编译时捕获异常?简单地说,我怎样才能抛出一个检查过的异常?

谢谢!

6 个答案:

答案 0 :(得分:6)

仅取消选中RuntimeException及其子类。 (好吧,Error及其子类也是如此,但是你不应该弄乱Error。)抛出一个已检查的异常所需要做的就是确保它不会扩展{ {1}}。

答案 1 :(得分:3)

是否检查了异常 NOT 如何抛出或声明它,它只取决于您选择的异常是否是从RuntimeException派生的。您在上面列出的那些都是从RuntimeException派生的,因此您的方法的客户端不需要捕获它们。

答案 2 :(得分:3)

检查Throwable的所有子类,但Error和RuntimeException的子类除外。 (你可以直接分类Throwable)

编译器会检查这些异常,但它们在运行时没有特殊的位置。即,您可以在编译器不知情的情况下抛出已检查的异常,并且它将正常运行。

e.g。

public static void throwChecked(Throwable t) /* no throws clause */ {
    Thread.currentThread().stop(t);
}

public static void main(String... args) /* no throws clause */ {
    throwChecked(new Throwable());
}

这会按照您的预期编译并打印Throwable。

答案 3 :(得分:1)

我认为你应该退后一步,学习为什么抛出已检查异常与未经检查的异常背后的理论。异常Java tutorial是一个很好的资源。

从标题为Unchecked Exceptions — The Controversy的页面

  

运行时异常表示编程问题导致的问题,因此,无法合理地期望API客户端代码从它们中恢复或以任何方式处理它们。

答案 4 :(得分:1)

请参阅此hack,这可能有所帮助(希望它不是OT)。

public class Test {

    // No throws clause here
    public static void main(String[] args) {
        doThrow(new SQLException());
    }

    static void doThrow(Exception e) {
        Test.<RuntimeException> doThrow0(e);
    }

    @SuppressWarnings("unchecked")
    static <E extends Exception> void doThrow0(Exception e) throws E {
        throw (E) e;
    }
}

答案 5 :(得分:0)

不必声明扩展RuntimeException的异常。

您可以声明方法:throws Exception甚至throws Throwable并且必须处理(尽管不建议)。