类似
int i = Integer.parseInt("e");
会抛出
java.lang.NumberFormatException
NumberFormatException 的隶属关系
Object
-Throwable
-Exception
-RuntimeException
-IllegalArgumentExcetipn
-NumberFormatException
挺正常,捕获 Exception 就能 catch 住他
然而如果这么写
static int i = Integer.parseInt("e");
会抛出
java.lang.ExceptionInitializerError ..
Caused by: java.lang.NumberFormatException ...
而 ExceptionInitializerError 的的隶属关系
Object
-Throwable
-Error
-LinkageError
-ExceptionInitializerError
这时,捕获 Exception 已经不能 catch 住这个异常了。需要捕获 Throwable 或者 Exception | Error 了。
然而同样都是做了一个Integer.parseInt("e"),这时升格成为 static,就造成了异常类的变化。导致捕获方式的变化。这是不是很奇怪?
当然这里的Integer.parseInt("e"),只是一个例子
如果你有你可爱的同学,在 static 块 /变量里面写了一大段复杂逻辑,搞出各种各样的 Exception,都会被升格成为ExceptionInitializerError。从而不能被 catch Exception 所 catch
从类的初始化过程、从编译的角度貌似能够理解这个 LinkageError。但从具体逻辑的角度,这为啥呢?
其实这个还有一个问题就是有人说到的所谓的异常处理"军规",Never catch Throwable class。这点在这个情况下又如何理解呢?