0

我在 Java 中偶然发现了这个奇怪的东西。在编码时,我不小心忘记实例化地图。在将数据放入其中时,一切都没有错误,但是在获取它们时,我得到了明显的 NullPointerException。这是我使用的代码片段:

public class Loader {
   private static Map<String, Object> map;
   public static load() {
       //...
       // read lines and put them into map
       map.put(line, new Object()); // <-- NO ERROR
       //...
   }

   public static parse(){
       //...
       for(...){
           map.get(key); //<-- ERROR on map (NullPointerException)
       }
       //...
   }
}

提供的代码是存根,主要目的是演示奇怪的地图行为。那么为什么可以将数据插入null呢?我正在使用 Java *1.6.0_29*。

请注意此代码是完整的,地图未在其他任何地方初始化;代码是完整的。

4

5 回答 5

0

简而言之,你不能这样做。相反,我怀疑在某个地方抛出的异常map.put()吞没了,而你没有看到它。

例如

try {
    (new Loader).load();
}
catch (Exception e) {
   // swallowed with no info here
}
于 2012-08-14T13:03:21.027 回答
0

此代码不完整...或者,您可能正在运行代码的先前编译版本。

于 2012-08-14T13:03:49.557 回答
0

我觉得很笨。正如@assylias 指出的那样,发生放置的代码永远不会执行。它在 for-each 循环中非常深入,由于之前的错误而没有执行。我感到惭愧。

于 2012-08-14T13:22:54.130 回答
0

这可能是您正在使用的 IDE 或 JDK 的问题,也可能是您的代码,因为当我尝试复制您的案例时,在编译时抛出了 java.lang.Error 异常,并显示本地变量映射不是初始化。

于 2012-08-14T13:54:17.050 回答
0

要么“map”被实例化,要么“put”行不可达。

于 2012-08-14T18:48:40.473 回答