Java 的有个异常设计一直没理解
类似
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。这点在这个情况下又如何理解呢?