HashMap:java.lang.NullPointerException:尝试调用虚方法'java.lang.Object java.util.HashMap.put'

时间:2018-04-28 10:42:39

标签: java android hashmap

我已初始化HashMap#onCreate方法,我想在HashMap方法中使用addLocation。一切看起来都不错,但我不明白为什么我会收到这个错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object java.util.HashMap.put(java.lang.Object, java.lang.Object)' on a null object reference

当我调用locationList#put方法时。

这是我的代码:

public class InitLocationsOnStartup extends Application implements LocationListener {
    HashMap < String, Double[] > locationList;
    List < StationViewModel > stations;

    @Override
    public void onCreate() {
        super.onCreate();
        stations = new ArrayList < StationViewModel > ();
        locationList = new HashMap < > (); // 
    }

    public void getStations(List < StationViewModel > list) {
        this.stations = list;
        addLocation(locationList);
    }

    public HashMap < String, Double[] > addLocation(HashMap < String, Double[] > locationList) {
        for (int i = 0; i < stations.size(); i++) {
            latLong = new Double[] {
                Double.parseDouble(stations.get(i).getLatitude()),
                    Double.parseDouble(stations.get(i).getLongitude())
            };

            if (stations.get(i).getStationName() != null && latLong != null) {
                locationList.put(stations.get(i).getStationName(), latLong);

            }
        }
        return locationList;;
    }

1 个答案:

答案 0 :(得分:1)

在这种情况下,addLocation方法在执行onCreate()方法之前被调用。

我猜你正在访问一个不受Android框架管理的InitLocationsOnStartup实例。

如果您有以下代码:

InitLocationsOnStartup startup = new InitLocationsOnStartup();
startup.addLocation(..., ...);

您将获得此NullPointerException

访问此类的最佳方式应该是使用

进行Android活动
getApplication()

方法。您可以创建一个静态工厂方法以安全的方式访问此对象,例如:

public static InitLocationsOnStartup getInitLocationsOnStartup(Activity activity) {
    return (InitLocationsOnStartup) activity.getApplication();
}

这可以为您提供已被Android正确初始化的InitLocationsOnStartup类的正确实例。

然后可以在Android活动中使用此方法:

InitLocationsOnStartup startup = getInitLocationsOnStartup(this);