Java中抛出Exception2为何Exception1/2捕获块提示不可达?
Java中catch块提示“不可达”的原因解析
先看你提供的代码:
public class App { public static void main(String[] args) throws Exception { int x = 0; try { throw new Exception2(); } catch (Exception e) {x += 1;} catch (Exception1 e) {x += 2;} catch (Exception2 e) {x += 3;} } } class Exception1 extends Exception { } class Exception2 extends Exception1 { }
出现“不可达”错误的核心原因是Java异常捕获的匹配顺序和父类异常的覆盖特性:
- 异常捕获的顺序规则:Java会从上到下依次检查try块抛出的异常是否匹配当前catch块的异常类型,一旦匹配成功就会执行该catch块,后续的catch块不会再被处理。
- 父类异常的覆盖能力:
Exception是所有异常的父类,Exception1继承自Exception,Exception2又继承自Exception1。所以第一个catch(Exception e)可以捕获所有类型的异常,包括你抛出的Exception2。 - 编译器的可达性检查:Java编译器会分析代码执行路径,当判定某个代码块永远不可能被执行时,就会标记为“不可达”。这里后面两个catch块永远没有被执行的机会,所以触发了这个错误。
简单说就是:前面的父类异常catch块把所有可能的异常都截胡了,后面的子类异常catch块根本轮不上执行,编译器直接给你报错提示。
如果想让代码符合预期,应该把更具体的异常catch块放在前面,调整后的代码如下:
public class App { public static void main(String[] args) throws Exception { int x = 0; try { throw new Exception2(); } catch (Exception2 e) {x += 3;} catch (Exception1 e) {x += 2;} catch (Exception e) {x += 1;} } }
这样抛出Exception2时,会优先匹配第一个catch(Exception2)块,执行x +=3,符合你的预期。
内容的提问来源于stack exchange,提问作者KodyN
相关产品推荐
相关产品推荐

