Java 错误类消息创建方式

Java 错误类消息创建方式,java,exception,error-handling,Java,Exception,Error Handling,我需要创建一个message类,该类可以检索消息的数据并将其打印出来。问题是,如果我删除相等的“testErr”,我必须在message类中提供静态字段值,如(public static String exc01=“testErr”;);我得到一个错误 Exception in thread "main" java.lang.NullPointerException at java.util.PropertyResourceBundle.handleGetObject(Unknown S

我需要创建一个message类,该类可以检索消息的数据并将其打印出来。问题是,如果我删除相等的
“testErr”
,我必须在message类中提供静态字段值,如(public static String exc01=“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.有更好/更好的方法来处理所有的消息逻辑吗

为此,我创建了message类,如下所示

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的包下有一个message文件,其中包含以下消息

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}创建扩展名 !测试者

您的代码调用

Messages.getString(Messages.exc01)
消息。exc01
是一个变量或类型字符串。其默认值为空。这不是你认为的“exc01”。你把变量的名字和它的值搞混了

因此,如果不初始化变量,上面的代码将尝试从具有null键的属性文件中获取消息,这是没有意义的:您必须提供非null键,这就是为什么会得到null点异常

如果您想获取密钥“exc01”的消息,则可以使用

Messages.getString("exc01")
或者您可以将任何字符串变量初始化为“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块将返回
!测试者。这就是为什么你有
!测试者在测试输出中。

问题到底是什么?您想知道NullPointerException的原因吗?不,如果在消息属性文件中我已经有消息的值,为什么我要将相等的“testErr”放在。。。