java - Java中的内部静态与非静态异常类
问题描述
我确实注意到关于静态和非静态内部异常类的奇怪行为。
例如下面的代码将无法编译:
public class MyClass<T> {
private class MyInnerException extends Exception { // won't compile
..
}
}
但是下面的代码将编译:
public class MyClass<T> {
private static class MyInnerException extends Exception { // will compile
..
}
}
为什么会这样?
有一件事可以肯定的是,由于类型擦除,我们不能有通用异常,但是上面不是通用异常类,而是在通用类内部。但是如果它是静态的,它是允许的,但如果它是非静态的,它是不允许的?
跟进问题,仅仅因为这里提到的 Generic 的类型擦除功能,就不允许泛型异常: https ://www.mscharhag.com/java/java-exceptions-and-generic-types 或者还有其他一些原因给它?
解决方案
有一件事可以肯定的是,由于类型擦除,我们不能有泛型异常,但是上面不是泛型异常类,而是在泛型类内部。
您的内部类(第一个片段)是一个泛型类,因为它的封闭类是一个泛型类,而封闭类是内部类的一部分。如果没有相应的封闭类实例,则无法创建内部类的实例。
至于为什么泛型类不能扩展Exception
:
如果泛型类是 Throwable 的直接或间接子类(第 11.1.1 节),则会出现编译时错误。
由于 Java 虚拟机的 catch 机制仅适用于非泛型类,因此需要此限制。
( JLS 8.1.2 )
即 catch 子句无法区分MyClass<String>.MyInnerException
and MyClass<Integer>.MyInnerException
,因此不允许使用通用异常类。