重启Eclipse后自定义字体失效问题求助
开发项目时,重启Eclipse后自定义字体完全失效,运行时抛出字体读取异常和空指针错误。
相关代码
private static Font vollkornBold; static { try (InputStream in = Program.class.getClassLoader().getResourceAsStream("TextBasedAdventure/src/main/assets/VollkornSC-Bold.ttf")) { vollkornBold = Font.createFont(Font.TRUETYPE_FONT, in); } catch (FontFormatException | IOException e) { e.printStackTrace(); } }
触发错误的代码
titleAdventureLabel.setFont(vollkornBold.deriveFont(Font.BOLD, 100));
报错信息
java.io.IOException: Problem reading font data.
at java.desktop/java.awt.Font.createFont0(Font.java:1208)
at java.desktop/java.awt.Font.createFont(Font.java:1076)
at TextBasedAdventure/main.Program.(Program.java:27)
Exception in thread "main" java.lang.NullPointerException: Cannot invoke "java.awt.Font.deriveFont(int, float)" because "main.Program.vollkornBold" is null
at TextBasedAdventure/main.Program.(Program.java:113)
at TextBasedAdventure/main.Program.main(Program.java:88)
已尝试的解决方法
- 重写代码
- 重新粘贴字体文件
- 移动assets文件夹
- 考虑重装Eclipse
问题分析与解决方案
核心问题
getResourceAsStream使用了项目文件系统的绝对路径,而非classpath路径,导致类加载器无法找到字体文件,最终vollkornBold为null,触发空指针异常。
具体修复步骤
修正资源路径
- 确保
assets文件夹位于项目的资源目录下(如Maven的src/main/resources、Gradle的src/main/resources),编译后该目录下的文件会被自动放入classpath根目录。 - 将资源路径改为
assets/VollkornSC-Bold.ttf,修改后的代码:private static Font vollkornBold; static { try (InputStream in = Program.class.getClassLoader().getResourceAsStream("assets/VollkornSC-Bold.ttf")) { if (in == null) { System.err.println("字体文件未找到,请检查路径或资源目录配置"); return; } vollkornBold = Font.createFont(Font.TRUETYPE_FONT, in); } catch (FontFormatException | IOException e) { e.printStackTrace(); } }
- 确保
验证资源打包情况
- 编译项目后,检查
target/classes(Maven)或build/classes/java/main(Gradle)目录下是否存在assets/VollkornSC-Bold.ttf文件。如果不存在,在Eclipse中右键项目 → Build Path → Configure Build Path → Source,将src/main/resources标记为Source Folder,确保资源能被正确复制到输出目录。
- 编译项目后,检查
添加空指针防护
在设置字体前判断字体对象是否为null,避免运行时崩溃:if (vollkornBold != null) { titleAdventureLabel.setFont(vollkornBold.deriveFont(Font.BOLD, 100)); } else { // 降级使用默认字体 titleAdventureLabel.setFont(new Font(Font.SERIF, Font.BOLD, 100)); }
内容的提问来源于stack exchange,提问作者Ori

