2013-02-02 179 views
1

我在开机接收器总是崩溃:的Android OnBootReceiver崩溃异常空指针

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

    } 

DATABSE有记录:

我有显示最后一个值从数据库中一个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()); 
      } 
     }); 

方法光标该按钮使用:

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不断引导他几乎做同样的事情用光标作为按钮而当越来越空指针异常。

+0

其中DatabaseManager类我认为创建或访问数据库,我们就需要通过上下文数据库类,因此确保你传递?和PLZ后完整的日志 –

+0

@ρяσѕρєяK完整的日志发布。我的DatabaseManager类创建并处理数据库(我调用getAllData的那些方法来自它)。 – user1880779

+0

什么是DatabaseManager类中的91行号码? –

回答

1

在日志中:

产生的原因:显示java.lang.NullPointerException

因为数据库实例里面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; 
} 

并且在使用它之前也检查光标为NULL onReceive方法BroadcastReceiver

1

首先,我会将您的所有代码移动到另一个程序 - 广播接收器最多运行10秒(当前),然后终止See this for more informationAnd This。任何未处理的代码将保持如此。这对于理解执行数据库操作时尤为重要。

你的空指针异常可能是你的光标,但你需要测试,以确定哪些是空的。在进行无法完成或发生错误的调用时(例如数据库操作),您也可能想要将代码包装在错误陷阱中。

只是一些建议,帮助您解决问题,使你的代码更加稳定。

+0

谢谢你的提示 – user1880779