192. Java 异常 - Java 异常处理之 Try 块详解
✅ 什么是 try 块?
在 Java 中,如果你想处理可能抛出异常的代码,第一步就是要把它包裹在一个 try 块中:
try {
// 可能抛出异常的代码
}
catch (异常类型 e) {
// 处理异常
}
finally {
// 无论是否异常,都会执行的代码
}
📌 其中,try 用于“尝试”执行代码,如果过程中发生异常,系统会转到 catch 来处理。
✍️ 示例:writeList() 方法的异常处理
我们继续使用之前的 ListOfNumbers 类。我们要处理两个可能出错的地方:
- 创建文件输出流:
new FileWriter(...)→ 可能抛出IOException(受检异常) - 获取列表元素:
list.get(i)→ 可能抛出IndexOutOfBoundsException(未受检异常)
🔧 方式一:整体 try 包裹整个方法逻辑
这是最常见、最清晰的方式,适合代码不长的情况:
public void writeList() {
PrintWriter out = null;
try {
System.out.println("进入 try 块");
out = new PrintWriter(new FileWriter("OutFile.txt"));
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + list.get(i));
}
}
// 后面会补充 catch 和 finally 块
}
- ✅ 把整个逻辑放在一个
try块中,清晰明了 - ✅ 稍后我们可以用多个
catch来分别捕获不同类型的异常 - ⚠️ 这里如果没有
catch或throws,编译器会直接报错,因为IOException是受检异常!
🔍 可选设计:每段代码单独 try 块?
当然也可以,比如你希望分别处理不同语句的异常:
try {
out = new PrintWriter(new FileWriter("OutFile.txt"));
} catch (IOException e) {
System.err.println("文件创建失败:" + e.getMessage());
}
try {
for (int i = 0; i < SIZE; i++) {
out.println("Value at: " + i + " = " + list.get(i));
}
} catch (IndexOutOfBoundsException e) {
System.err.println("访问列表越界:" + e.getMessage());
}
💡 但这种写法可读性较低,且资源关闭逻辑更容易遗漏,因此更推荐“整体 try 包裹”的做法。
🧠 培训小总结:
| 关键点 | 说明 |
|---|---|
| try 作用 | 捕获可能抛出异常的代码,保护程序稳定运行 |
| 放哪里? | 放在可能出错的代码段外围 |
| 一段还是多段? | 一段整体包裹逻辑清晰,适合绝大多数情况 |
| 如果出错? | 会自动跳转到对应的 catch 块中去处理 |
- “
try块就像安全气囊,只有在程序‘撞墙’时才会打开。” - “程序执行进入
try,就像走上玻璃桥;万一踩断,就靠catch来兜底。” - “没写
try,遇到IOException编译器直接说不干——它比你还着急。”