繁体   English   中英

在Java中使用国际化时出错

[英]An error using internationalization in Java

我正在学习国际化。 并提供类ResourceBundleListResourceBundle示例。

该示例演示了资源束SampleRB的用法。 编译后,我不断收到错误消息:

Английская версия программы: 
Exception in thread "main" java.lang.NullPointerException
    at java.util.ListResourceBundle.loadLookup(ListResourceBundle.java:202)
    at java.util.ListResourceBundle.handleGetObject(ListResourceBundle.java:130)
    at java.util.ResourceBundle.getObject(ResourceBundle.java:441)
    at java.util.ResourceBundle.getString(ResourceBundle.java:407)
    at LRBDemo.LRBDemo.main(LRBDemo.java:12)

该程序由LRBDemo类和主要方法组成:

public class LRBDemo {
    public static void main(String[] args) {

        ResourceBundle rd = ResourceBundle.getBundle("LRBDemo.SampleRB");

        System.out.println("Английская версия программы: ");
        System.out.println("Строка по ключу Title: " + rd.getString("title"));
        System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
        System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));


        rd = ResourceBundle.getBundle("LRBDemo.SampleRBde", Locale.GERMAN);

        System.out.println("\nНемецкая версия программы: ");
        System.out.println("Строка для ключа Title: " + rd.getString("title"));
        System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
        System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));
    }
}

使用英语的SampleRB类:

public class SampleRB extends ListResourceBundle {
    protected Object[][] getContents() {
        Object[][]  resources = new Object[3][2];

        resources[0][0] = "title";
        resources[0][1] = "MyProgram";

        resources[1][0] = "StopText";
        resources[1][1] = "Stop";

        resources[1][0] = "StartText";
        resources[2][1] = "Start";

        return resources;
    }
}

然后使用德语对SampleRBde进行分类:

public class SampleRBde extends ListResourceBundle {
    protected Object[][] getContents() {
        Object[][] resources = new Object[3][2];

        resources[0][0] = "title";
        resources[0][1] = "Mein Programm";

        resources[1][0] = "StopText";
        resources[1][1] = "Anschlag";

        resources[2][0] = "StartText";
        resources[2][1] = "Anfang";

        return resources;
    }
}

如果我使用LRBDemo类而不是ResourceBundle rd = ResourceBundle.getBundle("LRBDemo.SampleRB")此代码段,则ResourceBundle rd = ResourceBundle.getBundle("SampleRB")rd = ResourceBundle.getBundle("LRBDemo.SampleRBde", Locale.GERMAN); rd = ResourceBundle.getBundle("SampleRBde", Locale.GERMAN); (表示无包),然后得到:

Exception in thread "main" java.util.MissingResourceException: Can't find bundle for base name SampleRB, locale ru_RU
    at java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1564)
    at java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1387)
    at java.util.ResourceBundle.getBundle(ResourceBundle.java:773)
    at LRBDemo.LRBDemo.main(LRBDemo.java:9)

我的项目结构:

введитесюдаописаниеизображения

введитесюдаописаниеизображения

введитесюдаописаниеизображения

任何答案将不胜感激<3

UPD:

1)

 public class LRBDemo {
        public static void main(String[] args) {
            // загрузить комплект ресурсов по умолчанию
            ResourceBundle rd = ResourceBundle.getBundle("LRBDemo.SampleRB");

            System.out.println("Английская версия программы: ");
            System.out.println("Строка по ключу Title: " + rd.getString("title"));
            System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
            System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));

            // загрузить комплект ресурсов для поддержки немецкого языка
            rd = ResourceBundle.getBundle("LRBDemo.SampleRBde", Locale.GERMAN);

            System.out.println("\nНемецкая версия программы: ");
            System.out.println("Строка для ключа Title: " + rd.getString("title"));
            System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
            System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));
        }
    }

2)

public class LRBDemo {
    public static void main(String[] args) {
        // загрузить комплект ресурсов по умолчанию
        ResourceBundle rd = ResourceBundle.getBundle(SampleRB.class.getName());

        System.out.println("Английская версия программы: ");
        System.out.println("Строка по ключу Title: " + rd.getString("title"));
        System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
        System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));

        // загрузить комплект ресурсов для поддержки немецкого языка
        rd = ResourceBundle.getBundle(SampleRBde.class.getName());

        System.out.println("\nНемецкая версия программы: ");
        System.out.println("Строка для ключа Title: " + rd.getString("title"));
        System.out.println("Строка по ключу StopText: " + rd.getString("StopText"));
        System.out.println("Строка по ключу StartText: " + rd.getString("StartText"));
    }
}

一个简单的错字: resources[1][0] = "StartText"; 应该是resources[2][0] = "StartText"; 由于您没有设置resources[2][0] ,因此在尝试使用NPE时会产生NPE。

至于“找不到捆绑包”错误,您赋予getBundle的类名需要使用其包进行完全限定。 如果您不想输入包名称,则可以使用SampleRB.class.getName()代替"LRBDemo.SampleRB"

public class SampleRB extends ListResourceBundle {
    protected Object[][] getContents() {
        Object[][]  resources = new Object[3][2];

        ...

        resources[2][0] = "StartText"; //change this line.
        resources[2][1] = "Start";

        return resources;
    }
}

您在类中输入了错误的索引。 这将修复SampleRB的错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM