我需要创建可以检索消息数据的消息类并将其打印出来,问题是我必须在消息类中提供静态字段值,如(public static String exc01 =“testErr”;)if if I删除相等的"testErr"
;我得到一个错误;
Exception in thread "main" java.lang.NullPointerException
at java.util.PropertyResourceBundle.handleGetObject(Unknown Source)
at java.util.ResourceBundle.getObject(Unknown Source)
at java.util.ResourceBundle.getString(Unknown Source)
at test1.Messages.getString(Messages.java:19)
at test1.TestMessageClass.main(TestMessageClass.java:8)
1.如果消息属性文件已经包含错误值,我应该为类消息中的静态字符串exc01提供值吗?
2.更好/更好地完成所有消息逻辑?
为此我创建了消息类,如下所示
package msg;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class Messages {
private static final String BUNDLE_NAME = "test1.messages";
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
public static String exc01 ="testErr";
public static String exc02;
private Messages() {
}
public static String getString(String key) {
try {
return RESOURCE_BUNDLE.getString(key);
} catch (MissingResourceException e) {
return '!' + key + '!';
}
}
}
我在同一个包下面有消息文件,名为messages.properties并包含以下消息
exc01=Failed to create the extension for {0}
exc02=Failed to create the extension
我创建了简单的测试程序
public class TestMessageClass {
public static void main(String[] args) {
System.out.println(Messages.getString("exc01"));
System.out.println(Messages.getString(Messages.exc01));
}
}
打印
无法为{0}创建扩展程序 !testErr!
答案 0 :(得分:0)
您的代码调用
Messages.getString(Messages.exc01)
Messages.exc01
是变量或类型String。其默认值为null。它似乎不是“exc01”,因为你似乎相信。您将变量的名称与其值混淆。
因此,如果你没有初始化变量,上面的代码试图从属性文件中获取具有空键的消息,这没有意义:你必须提供一个非空键,这就是为什么你得到一个NullPointerException。
如果您想获取密钥“exc01”的消息,则可以使用
Messages.getString("exc01")
或者您可以将任何String变量初始化为“exc01”,并传递此变量:
public static String exc01 = "exc01";
...
Messages.getString(Messages.exc01);
请注意,exc01应定义为常量,而不是变量。因此它应该是最终的,并尊重常量的Java命名约定:
public static final String EXC01 = "exc01";
...
Messages.getString(Messages.EXC01);
请注意,如果使用“testErr”初始化变量,则代码将查找与属性文件中的键“testErr”关联的消息。由于这样的消息不存在,您将获得MissingResourceException,因此ctach块将返回!testErr!
。这就是您在测试输出中!testErr!
的原因。