Java泛型,包含产生编译时错误的异常

时间:2016-11-20 02:33:02

标签: java generics exception

我有这两种方法:

private static <T extends Throwable> void methodWithExceptionGeneric(final T t) throws T {
    throw t;
}

private static void methodWithExceptionNonGeneric(final Throwable t) throws Throwable {
    throw t;
}

当我这样称呼这些方法时:

methodWithExceptionGeneric(new IllegalArgumentException());
methodWithExceptionNonGeneric(new IllegalArgumentException()); // compile time error

我在非泛型方法中遇到编译时错误,说我在main方法中有一个未处理的异常,我需要声明一个throws语句或者捕获异常。

我的问题是:为什么只抱怨非通用方法?在我看来,泛型方法也抛出异常,所以不应该也必须处理它?<​​/ p>

1 个答案:

答案 0 :(得分:1)

原因很简单:
IllegalArgumentExceptionRuntimeException,这意味着它是未经检查的例外。你可以抓住它,但你不必这样做。由于泛型方法仅按其规范抛出IllegalArgumentException,因此编译器不会抱怨(未经检查的异常)。

另一方面,没有泛型的方法被指定为抛出任何Throwable,这意味着它也可以抛出未经检查的异常(和错误),这需要处理。

一旦你试图理解泛型方法会发生什么,这很容易看到:

methodWithExceptionGeneric(new IllegalArgumentException());

相当于

methodWithExceptionGeneric<IllegalArgumentException>(new IllegalArgumentException());

当我们看一下定义

private static <T extends Throwable> void methodWithExceptionGeneric(final T t) throws T ...

变成

private static <IllegalArgumentException> void methodWithExceptionGeneric(IllegalArgumentException) throws IllegalArgumentException ...

所以methodWithExceptionGeneric(new IllegalArgumentException());每个定义只能抛出IllegalArgumentException或任何其他未经检查的Exception。另一方面,非泛型方法可以抛出任何Exception,无论是选中还是未选中,因此必须从try-catch内调用 - 阻止处理方法抛出的任何内容。