2017-04-01 105 views
0

關注此問題的答案:How can I initialise a static Map?我試圖建立在我的項目靜態映射。
下面的代碼片段:初始化:空值返回

public class MyClass { 

    public static final Map<String, String> dataMap; 

    static { 
     Map<String, String> tempMap = new HashMap<String, String>(); 
     try { 
      // Getting a string value from a file, e.g. String data 
      String data = "data"; 
      tempMap.put("firstData", data); 
     } 
     catch(Exception e) {} 

     dataMap = Collections.unmodifiableMap(tempMap); 

     //DEBUG (I test it and it correctly prints "data") 
     System.out.println(dataMap.get("firstData")); 
    } 
} 

然後我可以調用該地圖的另一個類,如下所示:

public class AnotherClass { 

    @Before 
    public void MyMethod() { 
     System.out.println(MyClass.dataMap.get("firstData")); 
    } 

    @Test 
    public void testMethod() {} 
} 

現在它打印null,而不是價值的「數據」。
爲什麼?

+0

不,它不。但那不是你真正的代碼,因爲它甚至不能編譯。 –

+0

爲什麼你不能編譯這段代碼? – PenguinEngineer

+0

因爲MyMethod中缺少分號。發佈一個完整的重現問題的最小例子。如果我使用此代碼並修復它,並添加調用MyMethod的主方法,則無法重現該錯誤(如我所料)。 –

回答

0

你確定你的地圖不被修改別的地方(清除...)? 因爲這個代碼應該工作。

我不認爲「unmodifiableMap」是有用的,當你使用「最終」,它只是保護,地圖將不會被引用修改。所以值可以通過外部呼叫改變。

+0

唯一的區別似乎是該方法的MyMethod標註有@Before註解,因爲它是一個測試 – PenguinEngineer

+3

unmodifiableMap()是非常重要的。否則,您可以從任何地方獲取對該地圖的引用並將其清除(或添加/刪除元素),但這可能不是期望的。 –

+0

@PenguinEngineer發佈了一個完整的重現問題的簡單例子。 –

0

當我執行我的機器上相同的代碼它的工作和打印data兩倍你excpected,此代碼是不是你的問題。

UPDATE: 也許MyClass指向另一個MyClass在你的包? 檢查你的進口.. 嘗試編譯並從命令行運行它,並檢查你是否得到相同的結果,有一些你在這裏丟失的東西