我有这两种方法:
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>
答案 0 :(得分:1)
原因很简单:
IllegalArgumentException
是RuntimeException
,这意味着它是未经检查的例外。你可以抓住它,但你不必这样做。由于泛型方法仅按其规范抛出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
内调用 - 阻止处理方法抛出的任何内容。