java - 错误类消息创建方式

标签 java exception error-handling

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

最佳答案

您的代码调用

Messages.getString(Messages.exc01)
Messages.exc01是变量或类型String。其默认值为null。您似乎并不相信它不是“exc01”。您将变量的名称与其值混淆了。

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

如果要获取键“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!的原因。

关于java - 错误类消息创建方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17717497/

相关文章:

java - 需要使用 java 将 EMF 转换为 jpeg、png 文件格式

java - 秒表取消暂停不起作用

c++ - 使用 std::unique_ptr 有什么好处吗?

java - 将 Hibernate 配置放在不同的位置

error-handling - 向Flutter添加Multidex支持

java - 我将图像从一个目录复制到另一个目录,但它打开时显示为灰屏

java - 在 s :select 中使用 #this 时奇怪的 OGNL 行为

Java/Android - 如何打印出完整的堆栈跟踪?

c++ - 嵌套 for 循环 C++ 中的运行时错误

javascript - 为什么在javascript中出现未处理的 'error'事件