throw语句后的代码不可达,因throw会立即终止当前方法执行并跳转至异常处理机制,编译器在静态分析阶段即可判定后续语句无法执行,典型错误如throw后紧跟System.out.println会报Unreachable code。

throw 语句之后的代码会被编译器判定为不可达,因为程序执行到 throw 就会立即终止当前方法的执行流程,跳转到异常处理机制(如 catch 或向上抛出),所以紧跟在 throw 后面的语句永远无法被执行。
throw 后代码不可达的典型表现
例如以下写法会直接报错:
public void process() {
throw new IllegalArgumentException("参数错误");
System.out.println("这行永远不会运行"); // 编译报 Unreachable code
}
Java 编译器在编译阶段就能静态分析出:throw 执行后控制流必然中断,后续语句不可能被访问。
立即学习“Java免费学习笔记(深入)”;
解决方式是把逻辑提前或重构控制流
- 把需要执行的代码放在 throw 之前
- 如果该逻辑与异常条件相关,可考虑封装成方法调用再 throw
- 若需在抛出异常前做清理或记录,统一放在 throw 前完成
- 不要依赖 try-catch 包裹 throw 来“绕过”不可达检查——编译器不看运行时路径,只看静态控制流
注意和 throws 的区别
throws 只是声明可能抛出异常,不中断执行;而 throw 是实际抛出动作,会立即退出当前方法。比如:
public void loadFile() throws IOException {
FileInputStream fis = new FileInputStream("a.txt"); // 这行后还能写其他语句
System.out.println("文件已打开"); // ✅ 合法
}
但换成 throw 就不行:
public void loadFile() {
throw new IOException("手动抛出");
System.out.println("这行报错"); // ❌ 不可达
}
其他类似场景也要同步检查
除了 throw,return、break、continue 和无限循环(如 while(true))后面紧跟着的代码同样会触发 Unreachable code 错误。它们本质相同:编译器确认这些语句之后没有控制流能到达后续代码。


















