Java中try-catch结构是按异常类型精准捕获:try块仅包裹高风险操作且变量作用域受限;catch需指定具体异常类型并从具体到宽泛排列;finally确保资源清理必执行,JDK7+推荐用try-with-resources替代。

Java中 try-catch 的基础结构,核心就是用 try 包住可能出错的代码,再用 catch 捕获具体类型的异常并做响应处理。它不是万能兜底,而是按类型精准拦截,避免程序突然中断。
try 块:只放真正可能抛异常的代码
try 里不是写整个方法,而是聚焦在高风险操作上,比如除零、数组越界、文件读取、网络请求等。这些操作一旦出问题,会立即中断 try 内后续语句执行,并把异常对象抛出来。
- try 后的花括号
{ }不可省略,哪怕只有一行代码 - try 块内声明的变量是局部的,出了 try 就不可访问
- 不要把无关逻辑(如打印日志、初始化变量)塞进 try,否则干扰异常定位
catch 块:按异常类型匹配,不是“抓所有”
catch 后面括号里必须写具体的异常类名(如 ArithmeticException、NullPointerException),Java 会按顺序比对抛出的异常是否属于该类型或其子类。一个 try 可以配多个 catch,但建议从具体到宽泛排列。
- 例如先写
catch (FileNotFoundException e),再写catch (IOException e) - 避免直接捕获
Exception或Throwable,容易掩盖真实问题 - 捕获后别只写
e.printStackTrace(),至少记录日志或给出用户友好的提示
finally 块:确保关键清理动作一定执行
finally 不是必须的,但只要写了,无论 try 正常结束还是被 catch 拦下,它都会运行。典型用途是释放资源——比如关闭文件流、数据库连接、解锁线程等。
立即学习“Java免费学习笔记(深入)”;
- 即使 try 或 catch 中有
return,finally 也会先执行完再返回 - 如果 finally 里也抛异常,会覆盖 try/catch 中的异常(需谨慎)
- JDK 7+ 推荐用 try-with-resources 替代手动 finally 关闭资源,更简洁安全
一个干净的实战例子
下面这段代码处理数组访问,既明确又可控:
int[] nums = {1, 2, 3};
try {
System.out.println(nums[5]); // 抛出 ArrayIndexOutOfBoundsException
} catch (ArrayIndexOutOfBoundsException e) {
System.err.println("索引超出范围:" + e.getMessage());
} finally {
System.out.println("操作完成,清理工作已启动");
}
运行时会输出错误提示,然后执行 finally,程序继续往下走,不会崩溃。


















