java中异常处理核心是try-catch-finally:try块包裹可能抛异常的代码,catch按类型从具体到宽泛捕获并处理,finally确保资源释放(如关流),推荐用try-with-resources替代手动finally。

Java 中用 try-catch-finally 捕获并处理异常,核心是把可能出错的代码放进 try 块,用 catch 拦住对应异常类型,再用 finally 执行无论成败都要做的事(比如关流、释放资源)。
try 块:放可能抛异常的代码
try 后面必须跟至少一个 catch 或 finally。它不单独存在,里面写的是正常逻辑中容易出问题的部分,比如文件读写、网络请求、数组越界访问等。
- 不要把大量无关代码塞进
try,只包真正可能异常的语句,便于定位问题 - 一旦
try中某行抛出异常,后续语句不再执行,控制权立刻交给匹配的catch
catch 块:按类型捕获并处理异常
每个 catch 声明一个异常参数(如 IOException e),只能捕获该类型及其子类。可以写多个 catch,但顺序要从具体到宽泛(比如先 FileNotFoundException,再 IOException,最后 Exception)。
- 捕获后建议记录日志或给出用户友好的提示,而不是空 catch(即只写
{}) - 如果想重新抛出异常,可用
throw e;或封装后抛新异常(如throw new RuntimeException("读取失败", e);) - JDK 7+ 支持多异常捕获写法:
catch (IOException | SQLException e)
finally 块:确保执行的清理逻辑
finally 总会执行(除非 JVM 退出或遇到 System.exit())。常用于释放资源,比如关闭 FileInputStream、Connection、Scanner 等。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 即使
try或catch中有return,finally仍会在方法返回前运行 - 注意:如果
finally里也有return,它会覆盖try/catch中的返回值(不推荐这么写) - 更现代的写法是使用 try-with-resources(自动关闭实现了
AutoCloseable的资源),可省略finally
实际例子:读文件并安全关闭
下面是一个典型场景:
FileInputStream fis = null;
try {
fis = new FileInputStream("data.txt");
int data = fis.read();
System.out.println(data);
} catch (FileNotFoundException e) {
System.err.println("文件没找到:" + e.getMessage());
} catch (IOException e) {
System.err.println("读取出错:" + e.getMessage());
} finally {
if (fis != null) {
try {
fis.close(); // 可能再次抛 IOException
} catch (IOException e) {
System.err.println("关闭流失败:" + e.getMessage());
}
}
}
用 try-with-resources 更简洁安全:
try (FileInputStream fis = new FileInputStream("data.txt")) {
int data = fis.read();
System.out.println(data);
} catch (FileNotFoundException e) {
System.err.println("文件没找到:" + e.getMessage());
} catch (IOException e) {
System.err.println("读取或关闭出错:" + e.getMessage());
}
不复杂但容易忽略细节,关键是分清哪里可能错、该抓什么异常、哪些资源必须释放。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










