Java Android OnBootReceiver崩溃异常NullPointer
我的开机接收器不断崩溃:Java Android OnBootReceiver崩溃异常NullPointer,java,android,cursor,broadcastreceiver,Java,Android,Cursor,Broadcastreceiver,我的开机接收器不断崩溃: 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
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());
}
});
按钮正在使用的光标的方法:
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();
}
正如你们所看到的,它几乎和我在广播接收机中使用的一样。
单击该按钮后显示数据库中的文本视图(上次测试时):
它的日数和毫秒数
因此,记录被存储在数据库中,并且可以检索,但OnBootReceiver在引导时会不断出现空指针异常,而他使用光标执行的操作与该按钮几乎相同。首先,我会将您的所有代码移到另一个过程-广播接收器最多运行10秒(当前)然后终止!…任何未处理的代码都将保持不变。在执行数据库操作时,了解这一点尤为重要 您的空指针异常可能是您的游标,但您需要进行测试以确定什么是空的。在进行无法完成或发生错误的调用(如数据库操作)时,您可能还希望将代码封装在错误陷阱中 请给出一些建议,以帮助您解决问题并使代码更加稳定。如日志所示: 原因: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;
}
在
BroadcastReceiver
的onReceive
方法中使用游标之前,还要检查游标是否为NULL。DatabaseManager类在哪里?我认为,要创建或访问数据库,我们需要将上下文传递给database类,所以确保您正在传递它?并请发布完整日志@ρƏσѕρєK完整日志。我的DatabaseManagerr类创建并处理数据库(我调用getAllData的那些方法都来自它)。DatabaseManager类中的91行num是多少?编号91和92,getAllData方法:return db.query(TABLE_NAME,new String[]{TABLE_COLUMN_ID,TABLE_COLUMN_ONE,TABLE_COLUMN_TWO},null,null,null,null,null)
@ρ∑ρєK Cursor Cursor=“”;类型不匹配:无法从字符串转换为光标
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;
}