异常谋杀案--Java异常处理篇
🚨 一、异常初探:程序世界的“小感冒” 😷
💡 异常是什么?
在Java世界里,**异常(Exception)**就像是程序运行时的小感冒🤧,虽然不至于让它“挂掉”,但会让你的程序变得不舒服。
Throwable(可抛出)
├── Error(错误)❌ 系统级问题,程序无法处理
└── Exception(异常)⚠️ 程序可以捕获并处理├── RuntimeException(运行时异常)🚨 不强制处理└── 非RuntimeException(受检异常)🔍 必须try-catch或throws声明
🧪 二、异常家族成员介绍 👪
1. Error 错误家族 ❌
StackOverflowError:递归太深,栈溢出了😵💫
OutOfMemoryError:内存不够用了😭
特点:程序无力回天,只能认命💀
2. Exception 异常家族 ⚠️
✅ 受检异常(Checked Exceptions):
IOException:文件读写失败📁💔
SQLException:数据库连接不上🔌🚫
特点:编译器强迫你必须处理!
🚨 非受检异常(Unchecked Exceptions):
NullPointerException:对象没初始化就调用方法💥
ArrayIndexOutOfBoundsException:数组越界了😱
ArithmeticException:除以0啦⛔
特点:编译器不管你,全靠自觉!
🛡️ 三、异常处理四大法宝 🔱
1. try-catch:救火队员 🚒
try {int result = 10 / 0; // 危险操作💣
} catch (ArithmeticException e) {System.out.println("哎呀,除以0啦!别慌,我来救场!🚒");
}
2. finally:善后大师 🧹
无论有没有异常,都会执行,适合用来关闭资源🔒。
FileReader reader = null;
try {reader = new FileReader("file.txt"); // 打开文件📖// 读取内容...
} catch (IOException e) {System.out.println("读取失败!😢");
} finally {if (reader != null) {reader.close(); // 一定要关上文件🚪}
}
3. throws:甩锅高手 🙅♂️
不自己处理,把异常扔给调用者处理。
public void readFile() throws IOException {FileReader reader = new FileReader("file.txt"); // 可能会出错
}
4. throw:主动制造异常 🧨
当你发现不对劲,就可以主动抛出一个异常!
if (age < 0) {throw new IllegalArgumentException("年龄不能为负数!😡");
}
🤖 四、自定义异常:打造属于你的专属错误类型 🎨
有时候系统自带的异常不够用怎么办?那就自己造一个吧!🧱
示例代码:
public class InvalidAgeException extends Exception {public InvalidAgeException(String message) {super(message);}
}// 使用示例
public void checkAge(int age) throws InvalidAgeException {if (age < 0) {throw new InvalidAgeException("年龄不能小于0!");}System.out.println("年龄合法:" + age);
}
🧠 五、异常处理最佳实践 🦸♂️
✅ 好习惯养成指南:
建议 | 说明 |
---|---|
不要生吞异常 | 捕获了异常却什么都不做,比不捕获还可怕❗ |
明确捕获具体异常 | 不要catch(Exception e),要精确到具体类型🎯 |
记录日志 | e.printStackTrace() 太low了,要用日志框架记录📝 |
使用try-with-resources(JDK7+) | 自动关闭资源,告别finally里的垃圾代码🗑️ |
避免在finally中抛异常 | 否则可能掩盖try中的异常😱 |
示例:优雅的try-with-resources写法 ✨
try (FileInputStream fis = new FileInputStream("data.txt")) {int data = fis.read();System.out.println("读取的数据:" + data);
} catch (IOException e) {System.err.println("读取失败!错误信息:" + e.getMessage());
}
🧪 六、常见异常案例分析 📚
异常类型 | 场景 | 如何避免 |
---|---|---|
NullPointerException | 对象未初始化就调用方法 | 加空判断或使用Optional类📦 |
ArrayIndexOutOfBoundsException | 数组访问越界 | 循环前检查索引范围🔍 |
ClassCastException | 类型转换错误 | 使用instanceof判断后再转型🔄 |
NumberFormatException | 字符串转数字失败 | 使用正则校验或try-catch包裹🔢 |
FileNotFoundException | 文件不存在 | 提前检查文件是否存在📂 |
🎁 七、趣味总结一句话 🧾
异常就像生活中的小意外🌧️,我们可以选择崩溃崩溃再崩溃,也可以优雅地应对它,并继续前行🌈。
掌握好异常处理,让你的程序不再轻易“崩溃”,而是优雅地“报错”和“恢复”💪✨