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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

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

Q&A

解決済

2回答

3386閲覧

NullPointerExceptionが出る原因が分からない

j06110611

総合スコア54

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android Studio

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

0グッド

0クリップ

投稿2020/04/26 13:46

エラー

Error

1java.lang.NullPointerException: Attempt to invoke interface method 'int android.content.SharedPreferences.getInt(java.lang.String, int)' on a null object reference 2 at com.test.quizmaker.MainActivity$2.onClick(MainActivity.java:61)

やりたいこと

アプリを閉じてから更新をできるようにしたい。

試したこと

アプリを閉じずにbutton1を押し、更新(データ読み込み)することはできた。が、アプリを閉じてからbutton1を押すとNullPointerException

わかっていること

adbshellでSharedPreferenceでしっかり保存されていることが確認できた。

DataStore

1<map> 2 <string name="title1">t</string> 3 <string name="answer1">a</string> 4 <int name="count" value="1" /> 5 <string name="quiz1">q</string> 6</map> 7

また、MainActivity61行目

MainActivity

1int updateInt = PreferenceManager.sp.getInt("count",10);

で、値がnullになっている。

知りたいこと

countというキー名でアプリを閉じる事前に保存されていることが確認できたのになぜヌルポが出てしまうのかを知りたいです。

コード

MainActivity

1public class MainActivity extends AppCompatActivity { 2 private ArrayList data = new ArrayList<String>(); 3 private static final int REQUEST_CODE = 1; 4 private ArrayAdapter adapter; 5 6 @Override 7 protected void onActivityResult(int request_Code, int resultCode, Intent result){ 8 switch(request_Code){ 9 //MakeQuizActivityから戻ってきた場合 10 case(REQUEST_CODE): 11 //クイズを作るボタンを押して戻ってきたときの処理 12 if(resultCode == RESULT_OK){ 13 data.add(result.getStringExtra("INPUT_TITLE")); 14 adapter.notifyDataSetChanged(); 15 } 16 //押されなかったときの処理 17 else if(resultCode == RESULT_CANCELED){ 18 19 } 20 break; 21 } 22 } 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.activity_main); 26 27 // リスト項目とListViewを対応付けるArrayAdapterを用意する 28 adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, data); 29 // ListViewにArrayAdapterを設定する 30 ListView listView = (ListView) findViewById(R.id.listView); 31 listView.setAdapter(adapter); 32 Button button = (Button) findViewById(R.id.makeQuiz_Button1); 33 button.setOnClickListener(new View.OnClickListener() { 34 @Override 35 public void onClick(View v) { 36 Intent intent = new Intent(MainActivity.this, com.test.quizmaker.MakeQuizActivity.class); 37 startActivityForResult(intent, REQUEST_CODE); 38 } 39 }); 40 Button button1 = (Button)findViewById(R.id.update_Button); 41 button1.setOnClickListener(new View.OnClickListener() { 42 @Override 43 public void onClick(View v) { 44 //現時点のコード 45 int updateInt = PreferenceManager.sp.getInt("count",10); 46 ArrayList updateString = new ArrayList<String>(); 47 updateString.add(PreferenceManager.sp.getString(DataKeys.TITLE.getValue() + String.valueOf(updateInt),"nothing")); 48 data.add(updateString); 49 adapter.notifyDataSetChanged(); 50 System.out.println(updateString); 51 } 52 }); 53 } 54 //オプションメニューを作成 55 public boolean onCreateOptionsMenu(Menu menu){ 56 //menuにcustom_menuレイアウトを適用 57 getMenuInflater().inflate(R.menu.custom_menu, menu); 58 //オプションメニューを表示する場合はtrue 59 return true; 60 } 61 //メニュー選択時の処理 トースト表示 62 @Override 63 public boolean onOptionsItemSelected(MenuItem menuItem){ 64 //押されたメニューのIDで処理を振り分ける 65 //if(menuItem.getItemId() == R.id.menuClear){ 66 switch (menuItem.getItemId()) { 67 case R.id.menuSelect: 68 69 case R.id.menuClear: 70 adapter.clear(); 71 adapter.notifyDataSetChanged(); 72 PreferenceManager.clear(); 73 break; 74 } 75 return true; 76 } 77} 78

MakeQuizActiviy

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 intent = new Intent(MakeQuizActivity.this,com.test.quizmaker.MainActivity.class); 13 //PreferenceManager pm = new PreferenceManager(); 14 SharedPreferences sp = getSharedPreferences("DataStore",MODE_PRIVATE); 15 SharedPreferences.Editor editor = sp.edit(); 16 PreferenceManager.init(sp,editor); 17 String strTitle = ((EditText)findViewById(R.id.editText)).getText().toString(); 18 String strQuiz = ((EditText)findViewById(R.id.editText2)).getText().toString(); 19 String strAnswer = ((EditText)findViewById(R.id.editText3)).getText().toString(); 20 int count = 1; 21 PreferenceManager.saveInt(count); 22 PreferenceManager.saveString(strTitle, DataKeys.TITLE, String.valueOf(count)); 23 PreferenceManager.saveString(strQuiz, DataKeys.QUIZ, String.valueOf(count)); 24 PreferenceManager.saveString(strAnswer, DataKeys.ANSWER, String.valueOf(count)); 25 String title = PreferenceManager.sp.getString(DataKeys.TITLE.getValue() + String.valueOf(count), "Nothing"); 26 String quiz = PreferenceManager.sp.getString(DataKeys.QUIZ.getValue() + String.valueOf(count),"Nothing"); 27 String answer = PreferenceManager.sp.getString(DataKeys.ANSWER.getValue() + String.valueOf(count),"Nothing"); 28 intent.putExtra("INPUT_TITLE", title); 29 intent.putExtra("INPUT_QUIZ",quiz); 30 intent.putExtra("INPUT_ANSWER",answer); 31 count ++; 32 setResult(RESULT_OK, intent); 33 finish(); 34 } 35 }); 36 } 37} 38

PreferenceManager

1public class PreferenceManager{ 2 3 public static SharedPreferences sp; 4 private static SharedPreferences.Editor spEditor; 5 6 public static void init(SharedPreferences sp1, SharedPreferences.Editor editor1) { 7 sp = sp1; 8 spEditor = editor1; 9 } 10 11 public static void saveString(String s, DataKeys key, String c) { 12 spEditor.putString(key.getValue() + c, s); 13 spEditor.apply(); 14 } 15 16 public static void saveInt(int c) { 17 spEditor.putInt("count", c); 18 spEditor.apply(); 19 } 20 21 public static void clear(){ 22 spEditor.clear().commit(); 23 } 24}

DataKeys

1public enum DataKeys { 2 TITLE("title"), QUIZ("quiz"), ANSWER("answer"); 3 4 private String value; 5 6 private DataKeys(String value) { 7 this.value = value; 8 } 9 10 public String getValue() { 11 return this.value; 12 } 13}

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

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

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

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

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

keicha_hrs

2020/04/26 14:07

コードを記述する部分の1行目の```の右側には、ファイル名ではなく言語名(javaとか)を記述してください。
guest

回答2

0

PreferenceManagerクラスのフィールドのspはinit()メソッドが呼ばれたときに初期化されるようですが、このinit()メソッドを呼んでいるのはMakeQuizActivityでbutton2をクリックしたときだけのように思えます。MainActivityからアプリを再び起動し、MakeQuizActivityを経ることなくbutton1をクリックすると、init()メソッドが呼ばれる機会がないように思います。すると、spはnullのままということになるでしょう。そこで、

java

1 //現時点のコード 2 int updateInt = PreferenceManager.sp.getInt("count",10); 3

のように呼び出すと、中身がnullであるspを参照しているので、NullPointerExceptionになるのではないでしょうか。

検証するためには、この行にブレークポイントを設定してデバッグ実行し、spの値を確認してみることでしょう。

投稿2020/04/26 14:20

keicha_hrs

総合スコア6768

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

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

j06110611

2020/04/26 15:34

なるほど!分かりやすい解説ありがとうございます!助かります!
guest

0

ベストアンサー

実際に動かして試せてないのですが、アプリ起動直後にbutton1を押下すると、以下の処理がまだ行われていないのが原因ということはないですか?

※アプリ起動直後だと、PreferenceManagerクラスの"sp"という変数がインスタンス設定されておらず、NullPointerExceptionが発生しているのではないか。

java

1SharedPreferences sp = getSharedPreferences("DataStore",MODE_PRIVATE); 2SharedPreferences.Editor editor = sp.edit(); 3PreferenceManager.init(sp,editor);

投稿2020/04/26 14:19

tsuki01

総合スコア1751

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

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

j06110611

2020/04/26 15:36

なるほど!初期化ができてないということですね。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問