我在Java中的一些方法抛出了异常,例如NosuchelementException,IllegalargumentException等。但是,当使用这些方法时,这些异常似乎没有受到检查。换句话说,我的方法的呼叫者不需要对我的方法进行尝试/捕获。我读到的是,默认情况下的例外是“检查”,只有错误是“未选中”的错误。但是不知何故,我投掷的例外也没有选中。真奇怪。

我如何确保当我的方法引发异常时,呼叫者必须在编译时捕获异常?简而言之,我该如何提出检查例外?

谢谢!

有帮助吗?

解决方案

仅有的 RuntimeException 它的子类是不受限制的。 (出色地, Error 它的子类也是如此,但您不应该弄乱 Errors。)投掷检查例外所需要做的就是确保它不会扩展 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 这将必须处理(尽管不建议)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top