类似
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。这点在这个情况下又如何理解呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.