Eclipse中PropertyResourceBundle找不到sc.title键的异常求助
解决ResourceBundle在第二个JFrame中找不到键的问题
我来帮你排查这个头疼的问题——同一个资源包在主窗体能用,到第二个窗体就找不到键,这种情况大多和类加载器差异或者资源包实例的复用方式有关,咱们一步步来解决:
1. 优先复用已加载的ResourceBundle实例
不要在第二个JFrame里重新调用ResourceBundle.getBundle()加载资源,而是把主窗体已经加载好的实例直接传递过去。因为不同组件的类加载器可能存在差异,重新加载会导致找不到正确的资源文件路径。
举个实际代码示例:
// 主窗体中打开第二个窗体时,直接传递已加载的资源包实例 ResourceBundle lang = ResourceBundle.getBundle("ResBundle", new Locale("en")); SecondSettingFrame secondFrame = new SecondSettingFrame(lang); secondFrame.setVisible(true); // 第二个JFrame的构造方法接收并使用资源包 public class SecondSettingFrame extends JFrame { private ResourceBundle lang; public SecondSettingFrame(ResourceBundle lang) { this.lang = lang; // 现在调用getTitle就不会抛出找不到键的异常了 this.setTitle(lang.getString("sc.title")); // 其他初始化逻辑... } }
2. 确认资源文件的编译路径是否正确
你把lib/lang设为源文件夹,但要注意:ResourceBundle.getBundle("ResBundle")是从类路径根目录查找资源的。如果编译后ResBundle.properties被放到了lang子目录下,那你得把加载路径改成lang.ResBundle。
怎么验证路径是否正确?
- 打开项目的编译输出目录(默认是
bin或者target/classes) - 查看
ResBundle.properties是在根目录,还是在lang文件夹里 - 如果在
lang子目录下,加载代码要改成:ResourceBundle lang = ResourceBundle.getBundle("lang.ResBundle", new Locale("en"));
3. 检查资源键的拼写细节
虽然主窗体能正常读取,但还是要确认sc.title这个键在ResBundle.properties里确实没有拼写问题:
- 有没有大小写错误?比如写成
SC.title或者sc.Title - 键的前后有没有多余空格?比如
sc.title(末尾带空格) - 可以用文本编辑器打开properties文件,直接搜索
sc.title确认存在
4. 显式指定类加载器(兜底方案)
如果上面的方法都没解决,试试在加载资源包时显式指定当前类的类加载器,避免不同类加载器导致的资源查找差异:
ResourceBundle lang = ResourceBundle.getBundle("ResBundle", new Locale("en"), getClass().getClassLoader());
不管是主窗体还是第二个窗体,都用这个方式加载(或者直接传递已加载的实例更稳妥)。
内容的提问来源于stack exchange,提问作者Sebastian Fähr
相关产品推荐
相关产品推荐

