初始化:空值返回

问题描述:

关注此问题的答案: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的主方法,则无法重现该错误(如我所料)。 –

你确定你的地图不被修改别的地方(清除...)? 因为这个代码应该工作。

我不认为“unmodifiableMap”是有用的,当你使用“最终”,它只是保护,地图将不会被引用修改。所以值可以通过外部呼叫改变。

+0

唯一的区别似乎是该方法的MyMethod标注有@Before注解,因为它是一个测试 – PenguinEngineer

+3

unmodifiableMap()是非常重要的。否则,您可以从任何地方获取对该地图的引用并将其清除(或添加/删除元素),但这可能不是期望的。 –

+0

@PenguinEngineer发布了一个完整的重现问题的简单例子。 –

当我执行我的机器上相同的代码它的工作和打印data两倍你excpected,此代码是不是你的问题。

UPDATE: 也许MyClass指向另一个MyClass在你的包? 检查你的进口.. 尝试编译并从命令行运行它,并检查你是否得到相同的结果,有一些你在这里丢失的东西