错误类消息创建方式

时间:2013-07-18 07:42:23

标签: java exception error-handling

我需要创建可以检索消息数据的消息类并将其打印出来,问题是我必须在消息类中提供静态字段值,如(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!

1 个答案:

答案 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!的原因。