我在Java中的一些方法会抛出异常,例如NoSuchElementException,IllegalArgumentException等。但是在使用这些方法时,这些异常似乎未经检查。换句话说,我的方法的调用者不需要对抛出这些异常的方法执行try / catch。我读到它似乎默认情况下“异常”被“检查”,只有错误是“未选中”。但不知何故,我抛出的异常也未经检查。这很奇怪。
如何在我的方法抛出异常时确保调用者必须在编译时捕获异常?简单地说,我怎样才能抛出一个检查过的异常?
谢谢!
答案 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
并且必须处理(尽管不建议)。