Java自定义Fraction类序列化时报java.io.FileNotFoundException的解决方法
Java序列化Fraction对象抛出FileNotFoundException异常解决方案
该异常是文件创建/写入失败导致,结合你给出的代码,可按以下步骤排查解决:
- 替换文件名中的非法字符
你当前代码中的文件名仍保留了模板占位符"<your name>Fractions.dat",其中的<、>是绝大多数操作系统禁止使用的文件名字符,直接使用会导致文件创建失败。将占位符替换为不含特殊字符的真实名称即可,例如改为"liMingFractions.dat"。 - 检查写入路径权限
如果文件路径指向系统受保护目录(如Windows的C盘根目录、Program Files目录,macOS/Linux的根目录、系统目录),当前运行的Java程序没有写入权限也会触发该异常。建议指定为有权限的路径,比如直接写桌面的绝对路径:
Windows示例:String fileName = "C:/Users/你的用户名/Desktop/liMingFractions.dat";
macOS/Linux示例:String fileName = "/Users/你的用户名/Desktop/liMingFractions.dat"; - 确保路径的父目录存在
如果你使用了多级目录的路径(比如"save/data/liMingFractions.dat"),FileOutputStream不会自动创建不存在的父目录,需要先手动创建:String fileName = "save/data/liMingFractions.dat"; // 新增下面两行代码创建父目录 File targetFile = new File(fileName); targetFile.getParentFile().mkdirs(); try { ObjectOutputStream serializer = new ObjectOutputStream(new FileOutputStream(targetFile)); // 原有写入逻辑不变 - 优化资源释放逻辑(可选,避免资源泄漏)
你当前的代码如果在写入过程中抛出异常,serializer.close()不会执行,建议使用try-with-resources语法自动释放流资源:String fileName = "liMingFractions.dat"; try (ObjectOutputStream serializer = new ObjectOutputStream(new FileOutputStream(fileName))) { serializer.writeObject(fa); serializer.writeObject(alf); } catch(FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { System.out.println("序列化过程发生错误"); e.printStackTrace(); }
你已经确认Fraction类实现了Serializable接口,所以无需排查序列化本身的兼容性问题。
内容的提问来源于stack exchange,提问作者Mitchell Walker
相关产品推荐
相关产品推荐

