エラーログ
状態:解決済
閲覧数:11,933
投稿日:2013-02-05
更新日:2013-08-02
java.lang.NullPointerException
eclipse.buildId=M20120208-0800
java.version=1.6.0_30
eclipse.buildId=M20120208-0800
java.version=1.6.0_30
NullPointerException … ヌルポインタ例外
null値(定義されていない値のこと)の参照型変数を参照しようとした時に発生する例外
オブジェクトが必要な場合に、アプリケーションが null を使おうとするとスロー
・null オブジェクトのインスタンスメソッドの呼び出し
・null オブジェクトのフィールドに対するアクセスまたは変更
・null の長さを配列であるかのように取得
・null のスロットを配列であるかのようにアクセスまたは修正
・null を Throwable 値であるかのようにスロー
・null オブジェクトのフィールドに対するアクセスまたは変更
・null の長さを配列であるかのように取得
・null のスロットを配列であるかのようにアクセスまたは修正
・null を Throwable 値であるかのようにスロー
対策
・System.out.println(); を各所に挿入してnull参照の変数を探す
・場所がわかったら、次はなぜその変数が null のままなのかの原因を探していく
NullPointerExceptionに限らず、 例外によって停止することがないようにする方法は、以下の3通り
A. 例外が起こるデータをチェック
B. 例外をキャッチ
C. 例外が起こりえない設計を行う
A. 例外が起こるデータをチェック
・事前に、その値がnullかどうかの確認を実施
・ if (★★ == null) {
B. 例外をキャッチ
・try { ◆◆ } catch (Exception e) {
C. 例外が起こりえない設計を行う
・コンストラクタを使うことにより、 安全性の高く(NullPointerExceptionが発生しない)、 利用する場合にも使いやすいクラスを作成
実際に遭遇した例
エラーメッセージ
Sorry! The application ★★ has stopped unexpectedly.Please try again.
エラーログ
08-01 22:46:51.736: E/AndroidRuntime(278): FATAL EXCEPTION: main
08-01 22:46:51.736: E/AndroidRuntime(278): java.lang.NullPointerException
08-01 22:46:51.736: E/AndroidRuntime(278): at android.style.householdaccount.Item.onClick(Item.java:97)
内容08-01 22:46:51.736: E/AndroidRuntime(278): java.lang.NullPointerException
08-01 22:46:51.736: E/AndroidRuntime(278): at android.style.householdaccount.Item.onClick(Item.java:97)
・「android.style.householdaccount」パッケージ「Item」クラス「onClick」メソッドを実行する際、「null値(定義されていない値のこと)の参照型変数を参照しようとした時に発生する例外」が発生したため、エラー
エラー発生箇所
▼/src/android/style/householdaccount/Item.java
public void onClick(View v) {
if(v==button2){//内訳サーチボタン
// 正常起動時
try{
// クラスのインスタンス化
SubOpenHelper helper = new SubOpenHelper(getApplicationContext(),"test.db3",1);
//コンストラクタのデータを決める。コンテキスト、DBファイル名、バージョン。
// データベースの設定
SQLiteDatabase db;
db = helper.getWritableDatabase();
//データベースに書き込めるように設定
// db.execSQL("insert into Date_Table(Koumoku,Utiwake,Kingaku) values ('食事', 'ステーキ',1000);");
db.execSQL("insert into Date_Table(Item,Utiwake,Kingaku) values ('食事', 'ステーキ',1000);");
//insertで行に追加
dbtest1.setText("");
//dbtest1の初期化
// カーソルの設定
// String[] cols = {"Koumoku","Utiwake","Kingaku"};
String[] cols = {"Item","Utiwake","Kingaku"};
Cursor c = db.query("Date_Table",cols,null, null, null, null, null,null);
//カーソルのリストを作る。1:テーブル名、2:取得する列名(カラム等)の配列、
//3&4:取得するレコードの条件、5:GROUP BY条件、6:「HAVING」条件、
//7:「ORDER BY」条件、8:「limit」条件
boolean isEof = c.moveToFirst();
//カーソルを先頭に移動
while (isEof) {
//while文。カーソルが最後に行くまで繰り返す。
dbtest1.append(c.getString(0));
dbtest1.append(c.getString(1));
dbtest1.append(String.valueOf(c.getInt(2)));
//getString(0)メソッドで、カーソルの一行目を追加。2,3も同じ。
isEof = c.moveToNext();}
//次のリストにカーソルを移す。
c.close();
//終わったら閉じる。これがないとエラーとなる。データベースも。
db.close();
}
// 異常終了時
catch(SQLiteException e){
dbtest1.setText("エラー");
return;
}
}
・このコード自体に問題はない
・つまり、「エラー発生箇所」と「エラー原因箇所」は必ずしも一致しない
エラー原因
・「dbtest1」テキストオブジェクトがnull
エラー対応
▼/src/android/style/householdaccount/Item.java
・onCreateメソッド内にて、テキストオブジェクト取得
/* コンポーネントの設定 */
dbtest1 = (TextView)this.findViewById(R.id.dbtest1);
※つまり、この1行が抜けていたことが原因!
×
ゲストコメント一覧
番号 | 内容 | 投稿日 |
---|---|---|
1 | ワークベンチ・ビューおよびスタンドアロン・アプリケーションで、サンプルロードすると、「java.lang.NullPointerException」が表示される。 | 2013-12-17 |
コメント件数 … 1件 |