-
22-10-2019 - |
题
我在Java中的一些方法抛出了异常,例如NosuchelementException,IllegalargumentException等。但是,当使用这些方法时,这些异常似乎没有受到检查。换句话说,我的方法的呼叫者不需要对我的方法进行尝试/捕获。我读到的是,默认情况下的例外是“检查”,只有错误是“未选中”的错误。但是不知何故,我投掷的例外也没有选中。真奇怪。
我如何确保当我的方法引发异常时,呼叫者必须在编译时捕获异常?简而言之,我该如何提出检查例外?
谢谢!
解决方案
仅有的 RuntimeException
它的子类是不受限制的。 (出色地, Error
它的子类也是如此,但您不应该弄乱 Error
s。)投掷检查例外所需要做的就是确保它不会扩展 RuntimeException
.
其他提示
是否检查是否检查过例外 不是 如何扔它或声明它,仅取决于您选择的异常是否是从RuntimeException派生的。您上面列出的所有内容均来自RuntimeException,因此您的方法的客户端无需捕获它们。
除错误和RuntimeException的子类外,还要检查所有可投掷的子类。 (您可以直接投掷子类)
编译器检查这些例外,但是在运行时没有特殊位置。即,您可以在不了解编译器知道的情况下进行检查例外,并且它的表现通常会。
例如
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());
}
这会按照您的期望来编译和打印可投掷的。
看到这个 黑客, ,它可能会有所帮助(希望它不是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;
}
}
我认为您应该退后一步,学习背后的理论 为什么 要投票例外与未检查的例外。这 Java教程 例外是一个很好的资源。
从页面标题 未选中的例外 - 争议:
运行时异常代表了编程问题的结果问题,因此,API客户端代码不能合理地期望从它们中恢复或以任何方式处理它们。
扩展的例外 RuntimeException
不必被宣布。
您可以声明该方法: throws Exception
甚至 throws Throwable
这将必须处理(尽管不建议)。