【问题标题】:Gson & SharedPreferences lead to a NullPointerExceptionGson & SharedPreferences 导致 NullPointerException
【发布时间】:2017-02-02 09:57:30
【问题描述】:

我正在尝试将自创对象的 ArrayList 放入 SharedPreferences 中。虽然保存似乎有效,但调用 getSharedPreferences() 时出现以下错误:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.Object com.google.gson.Gson.fromJson(java.lang.String, java.lang.reflect.Type)' on a null object reference

我将其放入 SharedPreferences 的代码:

// FYI: gson = new Gson(); is set earlier on
// same goes for: ArrayList<MovieModel> movieModelList = new ArrayList<>();
// and: Type listType;

movieModelList.add(result);

String jsonMovieModelList = gson.toJson(movieModelList);

SharedPreferences prefs = getSharedPreferences("settings",
   MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString("jsonMovieModelList", jsonMovieModelList);
editor.apply();

还有 SharedPreferences 类:

public void getSharedPreferences() {
    SharedPreferences prefs = getSharedPreferences("settings",
            MODE_PRIVATE);

    String jsonMovieModelList = prefs.getString("jsonMovieModelList", null);
    Log.d("TAG", "Message" + jsonMovieModelList); // output is as expected

    // if not filled in, no action necessary
    if (jsonMovieModelList != null) {

        listType = new TypeToken<ArrayList<MovieModel>>(){}.getType();
        ArrayList<MovieModel> movieModelListSaved = gson.fromJson(jsonMovieModelList, listType);

        MovieModel lastMovie = movieModelListSaved.get(movieModelListSaved.size() - 1);

        showTitleSecond = (TextView)findViewById(R.id.show_title_2);
        showTitleSecond.setText(lastMovie.getTitle());
    }
}

gson 代码基于:https://google.github.io/gson/apidocs/com/google/gson/Gson.html

要明确: 我确实了解 NullPointerException 是什么,但我不明白为什么我会在这种情况下收到一个,因为我在执行之前检查了 String jsonMovieModelList 至少不为空。为什么 gson 会“丢失”参考?

我看这个问题:Android ArrayList of custom objects - Save to SharedPreferences - Serializable? 我看到的唯一区别是我有一个 ArrayList

【问题讨论】:

    标签: java android-studio nullpointerexception gson


    【解决方案1】:

    在此方法中使用变量 gson 之前,您似乎没有初始化它。只需在第一次使用之前添加Gson gson = new GsonBuilder().create();,或者在您正在调用的这个方法中添加它应该可以解决它。

    【讨论】:

    • 感谢您的浏览,但是,正如我在评论中所说的那样,我之前使用 gson = new Gson(); 初始化了 gson;还有其他建议吗?
    • 嗯,显示整​​个代码,可能变量范围与这个有关......
    • 阅读您的评论并重新阅读您的答案,您是对的!在 getSharedPreferences 中,我没有初始化 gson,当应用程序重新启动时,我先加载此方法。所以,向我道歉并感谢您的回答+评论:)
    • 没问题,我以为是这样的,发生在我身上很多次,这就是我知道的原因:D
    猜你喜欢
    • 2011-07-21
    • 1970-01-01
    • 2016-03-07
    • 2017-05-16
    • 1970-01-01
    • 2014-06-09
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多