2013-07-18 47 views
-1

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

print

无法为{0}创建扩展名 !testErr!

+0

究竟是什么问题?你想知道NullPointerException的原因吗? –

+0

不,为什么我应该把相等的“testErr”如果在消息属性文件中我已经有了消息的值... –

回答

0

代码调用

Messages.getString(Messages.exc01) 

Messages.exc01是一个变量或String类型。其默认值为空。你似乎并不相信,它不是“exc01”。您将变量的名称与其值混淆在一起。

所以,如果你没有初始化变量,上面的代码试图从属性文件中获取具有null键的消息,这是没有意义的:你必须提供一个非null键,这就是为什么你得到一个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!