首页 文章

抛出已检查的异常

提问于
浏览
1

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

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

谢谢!

6 回答

  • 3

    看到这个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;
        }
    }
    
  • 1

    除了Error和RuntimeException的子类之外,检查Throwable的所有子类 . (你可以直接子类Throwable)

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

    例如

    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 .

  • 0

    不必声明扩展 RuntimeException 的异常 .

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

  • 6

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

  • 3

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

  • 1

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

    从 Headers 为Unchecked Exceptions — The Controversy的页面:

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

相关问题