Java Android启动时接收器崩溃

Java Android启动时接收器崩溃,java,android,android-intent,broadcastreceiver,boot,Java,Android,Android Intent,Broadcastreceiver,Boot,我的手机已连接到Eclipse,但在手机“完全”启动并且在此之前我的接收器(应用程序)崩溃之前,我无法看到logcat,因此我无法调试它。我确信它与上下文和意图有关: 由于上下文问题,我的接收器在启动时崩溃,我确信: public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Calendar c2 = Calendar.getInstance();

我的手机已连接到Eclipse,但在手机“完全”启动并且在此之前我的接收器(应用程序)崩溃之前,我无法看到logcat,因此我无法调试它。我确信它与上下文和意图有关:

由于上下文问题,我的接收器在启动时崩溃,我确信:

 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(3);
    razlika = milibaza - milivreme;

    Intent intent1 = new Intent(context, AlarmReceiver.class);
    PendingIntent pendingintent = PendingIntent.getService(context, 2, 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());
    }
}   
更新,最终成功捕获异常:

01-06 02:21:19.920: E/AndroidRuntime(7360): java.lang.RuntimeException: Unable to start receiver com.example.prva.OnBootReceiver: java.lang.NullPointerException

您应该使用context,用context替换contextic,这样您就可以了。

因为您的代码还不清楚问题所在,但有一些建议供您参考

1) 变量
milivreme
milibaza
等必须是长型而不是int型

2) 使用
milivreme=System.currentTimeMillis()代替下面的代码以毫秒为单位给出当前时间

    Calendar c = Calendar.getInstance();                
    int hour = c.get(Calendar.HOUR_OF_DAY);
    int minute = c.get(Calendar.MINUTE);
    int sek = c.get(Calendar.SECOND);
    int dan;
    int dodaj;

    milivreme = ((hour * 60 * 60 * 1000)+ (minute * 60 * 1000) + (sek * 1000));
3) 检查游标是否不为空。在
cursor.moveToFirst()之前

4) 请参见此行>>

PendingIntent pendingintent = PendingIntent.getService(context, 2, intent1, PendingIntent.FLAG_CANCEL_CURRENT);
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

您应该使用
Context-Context
,不要使用
Context-contextic

private Context contextic;    //    NEEDLEES !
@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    Calendar c = Calendar.getInstance();                
    int hour = c.get(Calendar.HOUR_OF_DAY);
    int minute = c.get(Calendar.MINUTE);
    int sek = c.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(3);
    razlika = milibaza - milivreme;

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

    am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + razlika, pendingintent);
        }
        while (cursor.moveToNext());
    }}
我的问题是:为什么要编写
while(cursor.moveToNext())(问题是在循环后使用分号)


如果我的回答没有帮助,请提供堆栈跟踪。

已更改为您所说的内容,但在启动时仍会崩溃(请检查编辑的问题)。^是的。顺便说一句,改变了你所说的内容,仍然在开机时崩溃。(检查编辑的问题)您是否在AndroidManifest.xml中注册了接收者?是的,我注册了。我的清单中有这样的内容:
谢谢你的建议,我编辑了我的代码和我的问题。不幸的是,我在boot.dude上仍然遇到同样的崩溃。你不应该播放System.currentTimeMillis();在int中,必须将变量更改为long。你们知道int和long的限制吗?改变long变量中与时间相关的所有内容,你们可能会在数据库中插入错误的值,提高你们的java技能!!对不起,我只是从这里复制粘贴得太快了,所以…我知道限制,我知道存储的数字都在限制之内。无论如何,这不是主要的问题,当然…更新了我的问题。尽管如此,crashingI可以打赌你不懂Java基础知识,否则在提到三次应该使用长值来存储时间之后,int就不能使用了。你怎么知道这不是问题所在。对不起,我不能再帮你了。首先学习Java的基础知识。为什么你要让回答者保持在猜测之下?附加logcat堆栈跟踪(应用程序崩溃时出现的红色输出,前提是您的手机上有USB调试(默认情况下模拟器会这样做)),然后让它进行对话。另外,接收者有10秒的时间来做他们的工作,我不明白为什么你会有一个while循环。@a--C我已经告诉过你了,读我的第一句话。Logcat没有捕捉到错误,因为我猜错误发生在Logcat捕捉到错误之前。如果我能发布日志,我会很高兴。从命令行使用adb Logcat,应该会更快。您还可以创建一个将异常写入磁盘的异常处理程序。最后,重新开始,你有很多事情可能会出错。此外,上下文是一个上下文,除非您正在转换其他内容,否则这不是问题。您还可以更改此接收器,使其侦听自定义广播,然后在任何地方广播。你有相当多的可能性进行堆栈跟踪。很好
cursor
很有可能为空,所以这是我首先要检查的。另外,由于您捕获了异常,您是否有完整的日志?如果你这样做,应该有一个行号的地方。