【无标题】Java 异常与 IO

发布时间:2026/6/26 19:22:02
【无标题】Java 异常与 IO 一、异常程序的“安全气囊”什么是异常想象你在用计算器算 10 ÷ 0计算器不会崩溃而是显示一个“错误”。Java 里的异常就是类似的东西——程序运行中出问题了Java 会“抛”出一个异常对象告诉你哪里错了。最简单的异常处理下载try {int result 10 / 0; // 这里会出错} catch (ArithmeticException e) {System.out.println(“除数不能为零”);}try 里放可能出错的代码catch 里放出错后的处理方案。这样程序不会闪退而是优雅地给出提示。为什么要自定义异常Java 内置的异常有时不够“贴切”。比如读取学生成绩文件时格式错了抛个 IOException 太笼统。我们可以自己造class DataIntegrityException extends Exception {public DataIntegrityException(String message) {super(message);}这样在代码里 throw new DataIntegrityException(“第3行成绩格式错误”)一眼就知道问题在哪。异常链别丢了原始错误出问题时底层原因才是关键。异常链就是把底层的 IO 异常“包装”成业务异常同时保留原始堆栈try {// 读取文件} catch (IOException e) {throw new DataIntegrityException(“文件读取失败”, e); // 把原始异常 e 传进去}这样既给了友好的业务提示又能追溯到最底层的 IO 错误。二、IO程序与文件的“对话”读取文本文件Java 读取文件最常用的就是 BufferedReader一行行读BufferedReader reader new BufferedReader(new FileReader(“data.txt”));String line;while ((line reader.readLine()) ! null) {System.out.println(line);}reader.close();编码问题UTF-8 还是 GBKWindows 上默认 GBKLinux/Mac 默认 UTF-8。文件编码不对就会乱码。解决方法是先试 UTF-8不行再换 GBKBufferedReader reader;try {reader new BufferedReader(new InputStreamReader(new FileInputStream(“data.csv”), StandardCharsets.UTF_8));reader.readLine(); // 测试能否正常读取} catch (Exception e) {reader new BufferedReader(new InputStreamReader(new FileInputStream(“data.csv”), Charset.forName(“GBK”)));}对象序列化把对象存到文件序列化就是把 Java 对象“冻”成二进制存到硬盘反序列化就是“解冻”还原。比如保存学生列表// 序列化存ObjectOutputStream oos new ObjectOutputStream(new FileOutputStream(“students.ser”));oos.writeObject(studentList);oos.close();ObjectInputStream ois new ObjectInputStream(new FileInputStream(“students.ser”));List list (List) ois.readObject();ois.close();注意序列化的类必须实现 Serializable 接口并且最好加一个 serialVersionUID 版本号防止类改动后反序列化失败。class Student implements Serializable {private static final long serialVersionUID 20250101L;// …}如果版本号不匹配会抛 InvalidClassException抓住它就能友好提示“数据版本不兼容”。三、异常 IO 的黄金搭档实际开发中IO 操作最容易出异常所以二者总是同时出现。一个健壮的文件读取流程通常是文件不存在 → 自动创建空文件编码错误 → 尝试多种编码某行格式错误 → 跳过并记录日志不中断整体读取序列化失败 → 自动备份旧文件保留数据不丢失