【问题标题】:Initialization of a Static Map: null value returned静态映射的初始化:返回空值
【发布时间】:2017-04-01 15:22:49
【问题描述】:

按照这个问题的答案:How can I initialise a static Map? 我正在尝试在我的项目中创建一个静态地图。
下面一段代码 sn -p:

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,而不是值“data”。
为什么?

【问题讨论】:

  • 不,它没有。但这不是你真正的代码,因为它甚至不能编译。
  • 为什么不能编译这段代码?
  • 因为 MyMethod 中缺少分号。发布一个完整的最小示例来重现该问题。如果我使用这段代码并修复它,并添加一个调用 MyMethod 的主方法,我将无法重现错误(如我所料)。
  • 好的问题刚刚编辑
  • 无法复制。你可能有另一个名为 MyClass 的类,或者忘记重新编译,或者类似的东西。

标签: java collections static hashmap initialization


【解决方案1】:

您确定您的地图没有在其他地方修改(已清除,...)? 因为这段代码应该可以工作。

我认为“unmodifiableMap”在您使用“final”时没有用,它只是保护地图不会被引用修改。所以值可以通过外部调用来改变。

【讨论】:

  • 唯一的区别似乎是MyMethod这个方法被@Before注解了,因为它是一个测试
  • unmodifiableMap() 非常重要。否则,您可以获取对该地图的引用并从任何地方清除它(或添加/删除元素),尽管这可能是不希望的。
  • @PenguinEngineer 发布了重现问题的完整最小示例。
【解决方案2】:

当我在我的机器上执行相同的代码时,它可以正常工作并按您的预期打印两次data,此代码不是您的问题。

更新: 也许MyClass 指的是您包裹中的另一个MyClass? 检查你的进口.. 尝试编译并从命令行运行它并检查是否得到相同的结果,这里缺少一些东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 2019-10-22
    相关资源
    最近更新 更多