【问题标题】:Error class message creation way错误类消息创建方式
【发布时间】:2013-07-18 07:42:22
【问题描述】:

我需要创建可以检索消息数据并将其打印出来的消息类,问题是我必须在消息类中提供静态字段值,例如 (public static String exc01 ="testErr";)删除相等的"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!

【问题讨论】:

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

标签: java exception error-handling


【解决方案1】:

你的代码调用

Messages.getString(Messages.exc01)

Messages.exc01 是一个变量或字符串类型。它的默认值为空。它不是您似乎相信的“exc01”。您将变量的名称与其值混淆了。

所以,如果你不初始化变量,上面的代码会尝试从属性文件中获取具有空键的消息,这没有意义:你必须提供一个非空键,这就是为什么你得到一个 NullPointerException。

如果你想获取键“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 块将返回 !testErr!。这就是为什么您的测试输出中有!testErr!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-15
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多