gpt4 book ai didi

java - Android On BootReceiver 崩溃异常空指针

转载 作者:行者123 更新时间:2023-11-29 21:50:05 28 4
gpt4 key购买 nike

我的 On Boot Receiver 不断崩溃:

   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);

}

数据库有记录:

我有一个按钮,它在 TextView 中显示数据库中的最后一个值:

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 中使用的几乎相同。单击该按钮后的 textview 从数据库中显示(我上次测试):

1, 12120000 

它的天数和毫秒数。

所以记录被存储在数据库中,并且可以检索它们但是 OnBootReceiver 在引导时不断出现空指针异常,而他正在用光标做与该按钮几乎相同的事情。

最佳答案

在日志中:

Caused by: java.lang.NullPointerException

因为 db 实例在 getAllData 方法中是空的,所以在使用它之前做空检查:

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;
}

并在 BroadcastReceiveronReceive 方法中使用它之前检查游标是否为 NULL

关于java - Android On BootReceiver 崩溃异常空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14664670/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com