2013-07-18 42 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!