質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

2回答

827閲覧

NullPointerExceptionの原因と解決法を教えてほしいです!

j06110611

総合スコア54

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2019/08/10 04:12

クイズを作れて保存ができるようにしたいのですが、NullPointerExceptionが出てしまいます。
PreferencesManagerの27行目はspEditor.putString(key.getValue(),s);
MakeQuizActivityの31行目はpm.saveString(strTitle, PreferenceManager.DataKeys.TITLE);
です。
なぜヌルポが出ているのか、解決法をわかりやすく教えていただきたいです。

Error

1java.lang.NullPointerException: Attempt to invoke interface method 'android.content.SharedPreferences$Editor android.content.SharedPreferences$Editor.putString(java.lang.String, java.lang.String)' on a null object reference 2 at com.test.quizmaker.PreferenceManager.saveString(PreferenceManager.java:27) 3 at com.test.quizmaker.MakeQuizActivity$1.onClick(MakeQuizActivity.java:31) 4 at android.view.View.performClick(View.java:5610) 5 at android.view.View$PerformClick.run(View.java:22265) 6 at android.os.Handler.handleCallback(Handler.java:751) 7 at android.os.Handler.dispatchMessage(Handler.java:95) 8 at android.os.Looper.loop(Looper.java:154) 9 at android.app.ActivityThread.main(ActivityThread.java:6077) 10 at java.lang.reflect.Method.invoke(Native Method) 11 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 12 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)

MakeQuizActivity

1public class MakeQuizActivity extends AppCompatActivity { 2 3 @Override 4 protected void onCreate(Bundle savedInstanceState) { 5 super.onCreate(savedInstanceState); 6 setContentView(R.layout.activity_make_quiz); 7 8 Button button2 = (Button)findViewById(R.id.makeQuiz_Button2); 9 button2.setOnClickListener(new View.OnClickListener() { 10 @Override 11 public void onClick(View v) { 12 Intent intent2 = new Intent(MakeQuizActivity.this,com.test.quizmaker.MainActivity.class); 13 PreferenceManager pm = new PreferenceManager(); 14 SP(pm.sp, pm.spEditor); 15 String strTitle = ((EditText)findViewById(R.id.editText)).getText().toString(); 16 String strQuiz = ((EditText)findViewById(R.id.editText2)).getText().toString(); 17 String strAnswer = ((EditText)findViewById(R.id.editText3)).getText().toString(); 18 pm.saveString(strTitle, PreferenceManager.DataKeys.TITLE); 19 startActivity(intent2); 20 } 21 }); 22 } 23 public void SP(SharedPreferences pmsp, SharedPreferences.Editor pmse){ 24 pmsp = getSharedPreferences("DataStore", MODE_PRIVATE); 25 pmse = pmsp.edit(); 26 } 27}

PreferencesManager

1public class PreferenceManager{ 2 3 public SharedPreferences sp; 4 public SharedPreferences.Editor spEditor; 5 6 public enum DataKeys { 7 TITLE("title"), QUIZ("quiz"), ANSWER("answer"); 8 9 private String value; 10 11 private DataKeys(String value) { 12 this.value = value; 13 } 14 public String getValue() { 15 return this.value; 16 } 17 } 18 19 public void saveString(String s, DataKeys key){ 20 spEditor.putString(key.getValue(),s); 21 spEditor.apply(); 22 } 23} 24

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2019/08/10 04:34

> spEditor.putString(key.getValue(),s); の各オブジェクトについて, どれが Null になっているのかを確認されましたか.
s.m_1

2019/08/10 05:05

putString(String str1, String str2) では、仮引数の値が null でも正常に動くので、この場合は、spEditor が null ということになります。
gentaro

2019/08/10 05:08

デバッグの丸投げ依頼では
m.ts10806

2019/08/10 05:11

原因も解決法方もほぼほぼ出尽くしてる内容と思いますが。原因はエラーの通りですしね
s.m_1

2019/08/10 08:28

たしかに、gentaro さん、m.ts10806 さんのおっしゃる通りだと思います。 ただ、そのような質問が多いということも事実ですよね。
guest

回答2

0

そもそも、nullのものにアクセスしている、という例外です
だもんで、エラーが出たという行に登場している変数、クラス、メソッドの内容を手当たり次第にチェックしてみましょう
そのなかにnullのものを見つけたら、なぜそうなのか、これを解消するためには何をすればいいか、を考えましょう

投稿2019/08/10 08:16

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

java.lang.NullPointerException: Attempt to invoke interface method 'android.content.SharedPreferences$Editor android.content.SharedPreferences$Editor.putString(java.lang.String, java.lang.String)' on a null object reference

このエラーが伝えてくれていることは、

SharedPreferences.Editor は存在しなから参照 (使うことが) できないよ !

ということです。

つまり、

public SharedPreferences sp; public SharedPreferences.Editor spEditor;

この 2 つのオブジェクトは初期化できていないということです。

なので、

SP(pm.sp, pm.spEditor);

の代わりに、

PreferenceManager

1public void init(SharedPreferences sp, SharedPreferences.Editor editor) { 2 this.sp = sp; 3 this.spEditor = editor; 4}

を追加して、

MakeQuizActivity

1Intent intent2 = new Intent(MakeQuizActivity.this,com.test.quizmaker.MainActivity.class); 2PreferenceManager pm = new PreferenceManager(); 3// ここを追加しました。 4SharedPreferences sp = getSharedPreferences("DataStore", MODE_PRIVATE); 5SharedPreferences.Editor editor = sp.edit(); 6pm.init(sp, editor); 7// SP(pm.sp, pm.spEditor); 8String strTitle = ((EditText)findViewById(R.id.editText)).getText().toString(); 9String strQuiz = ((EditText)findViewById(R.id.editText2)).getText().toString(); 10String strAnswer = ((EditText)findViewById(R.id.editText3)).getText().toString(); 11pm.saveString(strTitle, PreferenceManager.DataKeys.TITLE); 12startActivity(intent2);

onClickメソッドの中を上のように変えると、正常に動くと思います。

基本的に、ヌルポは参照先のオブジェクトが初期化されていない場合に起こることが多いので、今回のような時は、オブジェクトがnullかどうかをLog.dなどで確認したほうが良いと思います。

以上、参考になれば幸いです。

追記ですが、PreferenceManagerのコンストラクタにContextを渡すことで、PreferenceManagerが初期化された際に、 SharedPreferencesSharedPreferences.Editorを初期化することができます。(俗に言うコンストラクタイジェクションです)

では、長文失礼いたしました。

投稿2019/08/10 05:02

編集2019/08/10 05:18
s.m_1

総合スコア293

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問