2015-01-15 40 views
2

我試圖使用一個簡單的java EnumMap來存儲道路類型到默認速度的映射。但我馬上就遇到了以下問題:奇怪的EnumMap行爲

我創建了一個簡單枚舉如下:

public enum RoadCategory { 

     AUTOBAHN("Autobahn", 0), 
     BUNDESSTR("Bundesstrasse", 1), 
     OTHER("other", -1); 

     private String name; 
     private int code; 

     private RoadCategory(String name, int code){ 
      this.name = name; 
      this.code = code; 
     } 
    } 

接下來,我創建了一個小型的類的試圖利用此枚舉作爲一個枚舉映射的關鍵:

import java.util.EnumMap; 
import java.util.Map; 

public class VehicleConfig { 

    public static void main(String[] args) throws Exception { 
     VehicleConfig v = new VehicleConfig(); 
     v.addSpeedMapping(RoadCategory.AUTOBAHN, 80.0); 
    } 

    private Map<RoadCategory,Double> speedMap; 

    public VehicleConfig(){ 
     this.speedMap = new EnumMap<RoadCategory, Double>(RoadCategory.class); 
    } 

    public double addSpeedMapping(RoadCategory category, double speed) throws Exception{ 
     if(speedMap == null) throw new Exception("speedmap NULL"); 
     if(category == null) throw new Exception("category NULL"); 
     return this.speedMap.put(category, speed); // this is line 20 
    } 
} 

不幸的是,addSpeedMapping在返回this.speedMap.put(category, speed);的行中拋出了NullPointerException。因此我添加了條件,但這在這裏沒有幫助。

Exception in thread "main" java.lang.NullPointerException 
    at hpi.bpt.traffic.VehicleConfig.addSpeedMapping(VehicleConfig.java:20) 
    at hpi.bpt.traffic.VehicleConfig.main(VehicleConfig.java:8) 

我不知道我在做什麼錯在這裏。有人知道如何得到這個固定/工作嗎?

回答

8

documentation:與密鑰關聯

以前的值,或空,如果有鍵的映射關係。 (返回null還可能表示該映射以前null與key關聯,如果實現支持null值。)

this.speedMap.put(category, speed);將返回null如果您category沒有鑰匙是在地圖上。

現在java會嘗試將null轉換爲double(這意味着java調用了null.doubleValue()),這會拋出一個NPE。

+0

謝謝!我只是將返回類型從'double'更改爲'Double',根據您的解決方案,該類型也適用。非常感謝! – sailingthoms