Java中的内部静态与非静态异常类

Java中的内部静态与非静态异常类,java,generics,exception,Java,Generics,Exception,我确实注意到关于静态和非静态内部异常类的一种奇怪行为 例如,以下代码将不会编译: public class MyClass<T> { private class MyInnerException extends Exception { // won't compile .. } } 公共类MyClass{ 私有类MyInnerException扩展异常{//将不编译 .. } } 但以下代码将编译: public class MyClass<T>

我确实注意到关于静态和非静态内部异常类的一种奇怪行为

例如,以下代码将不会编译:

public class MyClass<T> {
  private class MyInnerException extends Exception { // won't compile    
    ..
  }
}
公共类MyClass{
私有类MyInnerException扩展异常{//将不编译
..
}
}
但以下代码将编译:

public class MyClass<T> {
  private static class MyInnerException extends Exception { // will compile    
    ..
  }
}
公共类MyClass{
私有静态类MyInnerException扩展异常{//将编译
..
}
}
为什么会这样

有一点是肯定的,由于类型擦除,我们不能有泛型异常,但是上面的不是泛型异常类,而是在泛型类内部。但是如果它是静态的,它是允许的,但是如果它是非静态的,它是不允许的

后续问题,是否仅因为此处提到的泛型类型擦除功能而不允许泛型异常: 还是有其他原因

有一点是肯定的,由于类型擦除,我们不能有泛型异常,但是上面的不是泛型异常类,而是在泛型类内部

您的内部类(第一个代码段)是一个泛型类,因为它的封闭类是泛型类,而封闭类是内部类的一部分。如果没有封闭类的相应实例,则无法创建内部类的实例

关于泛型类不能扩展异常的原因:

如果泛型类是Throwable(§11.1.1)的直接或间接子类,则为编译时错误

由于Java虚拟机的捕获机制仅适用于非泛型类,因此需要此限制

()

i、 e.catch子句不能区分
MyClass.MyInnerException
MyClass.MyInnerException
,因此不允许使用泛型异常类