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

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

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

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

Android Studio

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

Q&A

1回答

2469閲覧

DataAccessから値が受け取れない

退会済みユーザー

退会済みユーザー

総合スコア0

NullPointerException

null値の参照型変数を参照しようとした場合に投げられる、Javaにおける例外のひとつです。

Java

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

Android Studio

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

0グッド

0クリップ

投稿2017/02/05 13:49

編集2022/01/12 10:55

##Android Studioでお寺メモアプリを開発しています。
第一画面でお寺リストが表示されそのお寺リストをタップするとその選択されたpositionのidからそのお寺の名前、宗教、所在地などをDBから取得しnullならばそのままxmlのEditTextは空白で、存在するならEditTextに取得した値を格納するという流れです。

app>javaフォルダには「TempleEditActivity.java(第二画面の処理)」、「TempleListActivity.java(第一画面の処理)」、「Temp.java(データ格納のエンティティ)」、「DataAccess.java(データベース処理のクラス)」、「DatabaseHelper.java(データベースのヘルパークラス)」があります。

今回のエラーですが、第一画面でお寺リストが表示されそのお寺をタップすると「問題が発生したため、終了します。」と出ました。
なのでコンソールにてエラー文を見てみましたが、よくわからなかったので質問いたします。

##下記がコンソールのエラーメッセージです。

java

1E/AndroidRuntime: FATAL EXCEPTION: main 2 Process: //こちらディレクトリです//, PID: 3816 3 java.lang.RuntimeException: Unable to start activity ComponentInfo{android.TempleList/android.TempleList.TempleEditActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.TempleList.Temp.gethonzon()' on a null object reference 4 at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2352) 5 at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2412) 6 at android.app.ActivityThread.access$800(ActivityThread.java:149) 7 at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1326) 8 at android.os.Handler.dispatchMessage(Handler.java:102) 9 at android.os.Looper.loop(Looper.java:211) 10 at android.app.ActivityThread.main(ActivityThread.java:5335) 11 at java.lang.reflect.Method.invoke(Native Method) 12 at java.lang.reflect.Method.invoke(Method.java:372) 13 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1016) 14 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:811) 15 Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.TempleListTemp.gethonzon()' on a null object reference 16 at android.TempleList.TempleEditActivity.onCreate(TempleEditActivity.java:46) 17 at android.app.Activity.performCreate(Activity.java:5933)

###実際コンソールのログにあった.javaファイルのソースコード

java

1TempleEditActivity.java 2 3package android.TempleList; 4 5import android.content.Intent; 6import android.os.Bundle; 7import android.support.v7.app.AppCompatActivity; 8import android.view.View; 9import android.widget.Button; 10import android.widget.EditText; 11import android.widget.TextView; 12 13public class TempleEditActivity extends AppCompatActivity { 14 15 private int _selectedTempNo = 0; 16 17 private String _selectedTempName = ""; 18 19 @Override 20 protected void onCreate(Bundle savedInstanceState) { 21 super.onCreate(savedInstanceState); 22 setContentView(R.layout.activity_temple_edit); 23 24 Intent intent = getIntent();//インテントの受け取り 25 Bundle extras = intent.getExtras(); 26 27 if(extras != null) { 28 //Idを取得 29 _selectedTempNo = extras.getInt("selectedPrefNo"); 30 _selectedTempName = extras.getString("selectedPrefName"); 31 32 Temp tempData = DataAccess.findByPK(TempleEditActivity.this, _selectedTempNo); 33 34 System.out.println("ok"); 35 36 //TextViewを取得 37 TextView tvTemp = (TextView) findViewById(R.id.tvTemp); 38 tvTemp.setText(_selectedTempName); 39 40 EditText ethon = (EditText) findViewById(R.id.ethon); 41 ethon.setText(tempData.gethonzon()); 42 43 EditText etsyu = (EditText) findViewById(R.id.etsyu); 44 etsyu.setText(tempData.getshushi()); 45 46 EditText etsyo = (EditText) findViewById(R.id.etsyo); 47 etsyo.setText(tempData.getaddress()); 48 49 EditText eturl = (EditText) findViewById(R.id.eturl); 50 eturl.setText(tempData.geturl()); 51 52 EditText etkan = (EditText) findViewById(R.id.etkan); 53 etkan.setText(tempData.getnote()); 54 55 Button etsave = (Button) findViewById(R.id.etsave); 56 etsave.setOnClickListener(new ButtonClickListener()); 57 } 58 59 } 60 61 /** 62 * ボタンクリック時の処理 63 */ 64 private class ButtonClickListener implements View.OnClickListener { 65 66 @Override 67 public void onClick(View view) { 68 EditText ethon = (EditText) findViewById(R.id.ethon); 69 EditText etsyu = (EditText) findViewById(R.id.etsyu); 70 EditText etsyo = (EditText) findViewById(R.id.etsyo); 71 EditText eturl = (EditText) findViewById(R.id.eturl); 72 EditText etkan = (EditText) findViewById(R.id.etkan); 73 74 String honzon = ethon.getText().toString(); 75 String syusi = etsyu.getText().toString(); 76 String syozaiti = etsyo.getText().toString(); 77 String url = eturl.getText().toString(); 78 String kan = etkan.getText().toString(); 79 80 DataAccess.update(TempleEditActivity.this, _selectedTempNo, _selectedTempName, honzon, syusi, syozaiti, url, kan); 81 82 finish(); 83 84 } 85 } 86}

java

1DataAccess.java 2package android.TempleList; 3 4import android.content.Context; 5import android.database.Cursor; 6import android.database.sqlite.SQLiteDatabase; 7import android.database.sqlite.SQLiteStatement; 8import android.util.Log; 9 10/** 11 * データベース上のデータを処理 12 */ 13public class DataAccess { 14 public static Temp findByPK(Context context, int id) { 15 DatabaseHelper helper = new DatabaseHelper(context); 16 SQLiteDatabase db = helper.getWritableDatabase(); 17 Cursor cursor = null; 18 Temp result = null; 19 String sql = "SELECT _id, name, honzon, shushi, address, url, note from temples WHERE _id = " +id; 20 21 System.out.println(sql); 22 23 try{ 24 cursor = db.rawQuery(sql, null); 25 while(cursor != null && cursor.moveToNext()) { 26 int idxname = cursor.getColumnIndex("name"); 27 int idxhonzon = cursor.getColumnIndex("honzon"); 28 int idxshushi = cursor.getColumnIndex("shushi"); 29 int idxaddress = cursor.getColumnIndex("address"); 30 int idxurl = cursor.getColumnIndex("url"); 31 int idxnote = cursor.getColumnIndex("note"); 32 33 String name = cursor.getString(idxname); 34 String honzon = cursor.getString(idxhonzon); 35 String shushi = cursor.getString(idxshushi); 36 String address = cursor.getString(idxaddress); 37 String url = cursor.getString(idxurl); 38 String note = cursor.getString(idxnote); 39 40 result = new Temp(); 41 result.setId(id); 42 result.setName(name); 43 result.sethonzon(honzon); 44 result.setshushi(shushi); 45 result.setaddress(address); 46 result.seturl(url); 47 result.setnote(note); 48 } 49 } 50 catch (Exception ex) { 51 Log.e("ERROR", ex.toString()); 52 } 53 finally { 54 db.close(); 55 } 56 return result; 57 } 58 59 /** 60 * メモ情報を更新するメソッド 61 */ 62 public static void update(Context context, int id, String name, String honzon, String shushi, String address, String url, String note) { 63 DatabaseHelper helper = new DatabaseHelper(context); 64 SQLiteDatabase db = helper.getWritableDatabase(); 65 66 String sql = "UPDATE temples SET name = ?, honzon = ?, shushi = ?, address = ?, url = ?, note = ?, WHERE _id = ?"; 67 try{ 68 SQLiteStatement stmt = db.compileStatement(sql); 69 stmt.bindString(1, name); 70 stmt.bindString(2, honzon); 71 stmt.bindString(3, shushi); 72 stmt.bindString(4, address); 73 stmt.bindString(5, url); 74 stmt.bindString(6, note); 75 stmt.bindLong(7, id); 76 77 stmt.executeInsert(); 78 } 79 catch (Exception ex) { 80 Log.e("ERROR", ex.toString()); 81 } 82 finally { 83 db.close(); 84 } 85 } 86 /** 87 * メモ情報を新規登録するメソッド 88 */ 89 public static void insert(Context context, String name, String honzon, String shushi, String address, String url, String note) { 90 DatabaseHelper helper = new DatabaseHelper(context); 91 SQLiteDatabase db = helper.getWritableDatabase(); 92 93 String sql = "INSERT INTO temples (name, honzon, shushi, address, url, note) VALUES (?, ?, ?, ?, ?, ?)"; 94 try{ 95 SQLiteStatement stmt = db.compileStatement(sql); 96 stmt.bindString(1, name); 97 stmt.bindString(2, honzon); 98 stmt.bindString(3, shushi); 99 stmt.bindString(4, address); 100 stmt.bindString(5, url); 101 stmt.bindString(6, note); 102 103 stmt.executeInsert(); 104 } 105 catch (Exception ex) { 106 Log.e("ERROR", ex.toString()); 107 } 108 finally { 109 db.close(); 110 } 111 } 112}

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

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

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

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

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

guest

回答1

0

Temp tempData = DataAccess.findByPK(TempleEditActivity.this, _selectedTempNo);がnullなんだと思いますよ。NullPointerExceptionがなぜ発生するかわかりますか?

コードはコード用の記述に修正してください。

投稿2017/02/05 14:20

yona

総合スコア18155

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

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

退会済みユーザー

退会済みユーザー

2017/02/05 14:53

回答ありがとうございます。 指摘されたtempDataの値をコンソールにだすとおっしゃる通りnullになっておりました。 Temp tempData = DataAccess.findByPK(TempleEditActivity.this, _selectedTempNo); の上の行の _selectedTempNo = extras.getInt("selectedPrefNo"); ではIDが取れてきており、そのIDでDataAccessでSQLを実行し検索された値をresultに入れreturnしているのですがnullが入っておりました。 DataAccess.javaのresultへの格納がおかしいのでしょうか、DataAccessのソースコードも追加記載します。
yona

2017/02/05 22:15

findByPKをステップ実行し、どこからnullになっているのかをデバッグしてください。
退会済みユーザー

退会済みユーザー

2017/02/06 02:01

ステップ実行をした結果、findByPKのrawQueryまで実行できwhileのstringにブレークポイントを設置するとwhileに入った瞬間落ちました。 whileの書き方はあっていると思うのですが…
yona

2017/02/06 02:32

想像だけでコメントするのは意味がないのでやめましょう、エラーログ等の事実だけを書いてください。
退会済みユーザー

退会済みユーザー

2017/02/06 02:41

エラーログは記載している通りになります。
yona

2017/02/06 02:59

try-catchで例外を全てキャッチしているので、質問のエラーログの前にエラーが発生しているはずです。 Exceptionでcatchするのはやめましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問