2016-09-24 12 views
0

自己作成オブジェクトのArrayListをSharedPreferencesに配置しようとしています。Gson&SharedPreferencesによってNullPointerExceptionが発生する

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クラス:

省が動作しているようですが、私はgetSharedPreferences()が呼び出されたときに次のエラーを取得します https://google.github.io/gson/apidocs/com/google/gson/Gson.html

:を

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コードが基づいています NullPointerExceptionが何であるかはわかりますが、jsonMovieModelListが少なくともnullではないことを実行する前にチェックしているので、なぜこのような状況で受け取られるのか理解できません。なぜgsonは参照を失うのですか?

私はこの質問を見て:Android ArrayList of custom objects - Save to SharedPreferences - Serializable?と私が見る唯一の違いは、私はあなたがこの方法では、その使用前に変数gsonを初期化しないようにしましたArrayListの

答えて

1

はそう持っているということです。最初の使用の前にGson gson = new GsonBuilder().create();を追加するか、このメソッドで呼び出しているので、修正する必要があります。

+0

ありがとう、ありがとうございます。しかし、私がコメントした行で私はgson = new Gson()でgsonを初期化します。他の提案はありますか? – CorneeldH

+0

ええと、全体のコードを見て、多分変数スコープはこれと何か関係があります... – Vucko

+0

あなたのコメントを読んで、あなたの答えを読んで、あなたは正しかった! getSharedPreferencesでは、私はgsonを初期化せず、アプリケーションが再起動されたときに何かの前にこのメソッドをロードします。だから、私の側からの謝罪と答え+コメントのために感謝:) – CorneeldH

関連する問題