1

オン ブート レシーバーがクラッシュし続ける:

   01-06 03:20:13.861: E/AndroidRuntime(15832): FATAL EXCEPTION: main
01-06 03:20:13.861: E/AndroidRuntime(15832): java.lang.RuntimeException: Unable to start receiver com.example.prva.OnBootReceiver: java.lang.NullPointerException
01-06 03:20:13.861: E/AndroidRuntime(15832):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2043)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at android.app.ActivityThread.access$2400(ActivityThread.java:132)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1098)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at android.os.Looper.loop(Looper.java:143)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at android.app.ActivityThread.main(ActivityThread.java:4277)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at java.lang.reflect.Method.invokeNative(Native Method)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at java.lang.reflect.Method.invoke(Method.java:507)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at dalvik.system.NativeStart.main(Native Method)
01-06 03:20:13.861: E/AndroidRuntime(15832): Caused by: java.lang.NullPointerException
01-06 03:20:13.861: E/AndroidRuntime(15832):    at com.example.prva.DatabaseManager.getAllData(DatabaseManager.java:91)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at com.example.prva.OnBootReceiver.onReceive(OnBootReceiver.java:32)
01-06 03:20:13.861: E/AndroidRuntime(15832):    at android.app.ActivityThread.handleReceiver(ActivityThread.java:2028)
01-06 03:20:13.861: E/AndroidRuntime(15832):    ... 10 more

放送受信機 :

@Override
    public void onReceive(Context context, Intent intent) {
        // TODO Auto-generated method stub
        Calendar c2 = Calendar.getInstance();               
        int hour = c2.get(Calendar.HOUR_OF_DAY);
        int minute = c2.get(Calendar.MINUTE);
        int sek = c2.get(Calendar.SECOND);

        int dan;
        int dodaj;

        milivreme = ((hour * 60 * 60 * 1000)+ (minute * 60 * 1000) + (sek * 1000));

        Cursor cursor = DatabaseManager.getAllData();

        cursor.moveToFirst();
        if (!cursor.isAfterLast())
        {
            do
            {               
        milibaza = cursor.getInt(2);
        razlika = milibaza - milivreme;

        Intent intent1 = new Intent(context, AlarmReceiver.class);
        PendingIntent pendingintent = PendingIntent.getService(context, 3, intent1, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager am = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);

        am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + razlika, pendingintent);
            }
            while (cursor.moveToNext());
        }
        cursor.close(); 
    }

getAllData メソッド:

public static Cursor getAllData() {

        return db.query(TABLE_NAME, new String[] { TABLE_COLUMN_ID, TABLE_COLUMN_ONE, TABLE_COLUMN_TWO }, 
                null, null, null, null, null);       

    }   

データベースにはレコードがあります:

データベースの最後の値をテキストビューに表示するボタンがあります:

public void onClick(View v) {
                // TODO Auto-generated method stub
                String BazaDan;
                int BazaVrijeme;
                DatabaseManager.Cursoric();

                BazaDan = DatabaseManager.getDan();
                BazaVrijeme = DatabaseManager.getVrijeme();
                textbaza.setText(new StringBuilder(BazaDan).append(", ").append(BazaVrijeme).toString());
            }
        });

ボタンが使用している Cursor のメソッド:

public static void Cursoric(){

        Cursor cursor;
        cursor = db.query
                (
                        TABLE_NAME,
                        new String[] { TABLE_COLUMN_ID, TABLE_COLUMN_ONE, TABLE_COLUMN_TWO },                       
                        null, null, null, null, null
                );
        cursor.moveToFirst();
        if (!cursor.isAfterLast())
        {
            do
            {
                BazaDan = cursor.getString(1);
                BazaVrijeme = cursor.getInt(2);
            }
            while (cursor.moveToNext());
        }    

        cursor.close(); 
    }

ご覧のとおり、BroadcastReceiver で使用しているものとほぼ同じです。そのボタンをクリックした後のテキストビューは、データベースから表示されます(前回テストしたとき):

1, 12120000 

その日番号とミリ秒。

そのため、レコードはデータベースに保存されており、取得することはできますが、OnBootReceiver は、そのボタンとほぼ同じことをカーソルで実行しているときに、起動時に null ポインター例外を取得し続けます。

4

2 に答える 2

1

まず、すべてのコードを別の手順に移動します-ブロードキャストレシーバーは最大10秒(現在)実行されてから終了します詳細については、これを参照してくださいそしてこれ。未処理のままになっているコードはそのまま残ります。これは、データベース操作を実行するときに理解することが特に重要です。

nullポインタ例外はカーソルである可能性がありますが、何がnullであるかを判断するためにテストする必要があります。また、データベース操作のように、完了できない呼び出しやエラーが発生する呼び出しを行う場合は、コードをエラートラップでラップすることもできます。

問題を解決し、コードをより安定させるのに役立ついくつかの提案。

于 2013-02-02T19:06:34.127 に答える
1

ログのように:

原因: java.lang.NullPointerException

db インスタンスはgetAllDataメソッド内で null であるため、次のように使用する前に null チェックを行うだけです。

public static Cursor getAllData()
{
       Cursor cursor=null;
    if(db!=null)
    {
      cursor=db.query(TABLE_NAME, new String[] 
              { TABLE_COLUMN_ID, TABLE_COLUMN_ONE, 
              TABLE_COLUMN_TWO }, null,
               null, null, null, null);
    }

return cursor;
}

onReceiveまた、メソッド内で使用する前にカーソルのNULLをチェックしますBroadcastReceiver

于 2013-02-02T19:17:17.797 に答える