[英]An error using internationalization in Java
我正在学习国际化。 并提供类ResourceBundle
和ListResourceBundle
示例。
该示例演示了资源束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.