当前位置: 首页 > 知识库问答 >
问题:

android中的NullPointerException:如何设置上下文?

饶元章
2023-03-14

如何修复此错误?

java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.hashCode()' on a null object reference
ACTIVITY.onNewIntent(Adult1Activity.java:243)

这是包含此错误的方法:

private void ExtendedNotification(String time) {
    Intent resultIntent = new Intent(this, Adult1Activity.class);

    resultIntent.putExtra("A", "restore");
    PendingIntent restoreIntent = PendingIntent.getActivity(Adult1Activity.this, 0, resultIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    resultIntent.putExtra("A", "close");
    PendingIntent closeIntent = PendingIntent.getActivity(Adult1Activity.this, 2, resultIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

     final NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(Adult1Activity.this)
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle("App Name")
            .setContentText(time)
            .setAutoCancel(true)
            .addAction(new NotificationCompat.Action(R.mipmap.ic_launcher, "Restore", restoreIntent))
            .addAction(new NotificationCompat.Action(R.mipmap.ic_launcher, "Close", closeIntent))
            .setContentIntent(restoreIntent);

     notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    Notification notification = notificationBuilder.build();
    notification.flags |= Notification.FLAG_NO_CLEAR | Notification.FLAG_ONGOING_EVENT;

    notificationManager.notify(0, notification);
}
@Override
protected void onNewIntent(Intent intent) {
    switch (intent.getStringExtra("A")) {
        case "restore":
            tv.setText(timeString);
            break;

        case "close":
            countDownTimer.cancel();
            isRunning = false;
            notificationManager.cancel(0);
            CloseApp();
            break;
    }

我认为问题不在于使用上下文。

我的应用程序中有一个带有StopBTN的计数器,我使用2个按钮创建通知。其中之一是RestoreBTN,它显示了我的活动类。现在,当我单击StopBTN时,显示此错误。

编辑:handleIntent方法中存在NullPointer错误。

private void handleIntent(Intent intent) {
    final String a = intent.getStringExtra(EXTRA_NOTE);
    if (a != null) {
        switch (a) {
            case NOTE_RESTORE:
                tv.setText(timeString);
                notificationManager.cancel(notification_id);
                break;

            case NOTE_CLOSE:
                countDownTimer.cancel();
                isRunning = false;
                notificationManager.cancel(notification_id);
                break;
        }
    }

共有1个答案

印劲
2023-03-14

您可能需要为额外的键设置一个常量,以避免打字错误或看起来像是输入错误的语言。此外,为动作设置常量也很好

private static final String EXTRA_A = "A";
private static final String A_RESTORE = "restore";
private static final String A_CLOSE = "close";

我不知道您是否这样做,但不能手动调用onNewIntent()。此外,如果您的活动在单击通知时被销毁,则可能不会调用onNewIntent()。您需要创建两个条目来检查意图,一个用于当活动已经运行并且您获得onNewIntent()时,另一个用于如果它被重新创建并且您在onCreate()中获得意图

@Override
protected void onCreate(Bundle b) {
    super.onCreate(b);
    // init views and stuff, and in final onCreate line handle the intent
    handleIntent(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent); // Make sure to call super
    handleIntent(intent);
}

崩溃意味着你的意图并不真的包含额外的A。您不能在空字符串上使用< code>switch,因此如果您检查A是否为空,那么您会很安全。

private void handleIntent(Intent intent) {
    final String a = intent.getStringExtra(EXTRA_A);
    if (a != null) {
        switch (a) {
           case A_RESTORE:
               ...

           case A_CLOSE:
               ...

不要为不同的< code >挂起内容修改相同的意图。它们是可变的,并且< code>getActivity()不会创建防御性副本。

final Intent resultIntentRestore = new Intent(this, Adult1Activity.class);
resultIntentRestore.putExtra(EXTRA_A, A_RESTORE);
PendingIntent restoreIntent = PendingIntent.getActivity(Adult1Activity.this, 
        0, resultIntentRestore, PendingIntent.FLAG_UPDATE_CURRENT);

final Intent resultIntentClose = new Intent(this, Adult1Activity.class);
resultIntentClose.putExtra(EXTRA_A, A_CLOSE);
PendingIntent closeIntent = PendingIntent.getActivity(Adult1Activity.this, 
        2, resultIntentClose, PendingIntent.FLAG_UPDATE_CURRENT);
 类似资料:
  • 我必须在tomcat 7中部署我的app.war文件。的。war文件名后面是它的版本号。这里我需要设置一个上下文路径,这样实际的url将只包含应用程序名(没有版本号)。 我的要求是,服务器中不应该有编辑.xml。 这是我的背景。xml如下所示。 context.xml放在war at /META-INF文件夹中。谁能告诉我我错在哪里?

  • 在传统的web.xml类型配置中,您可以像这样配置上下文参数 web.xml 这是如何在Spring启动中实现的。我有一个需要参数的过滤器。 我使用的是,并包含了

  • 我是一个Spring新手,正在制作一个Spring Web应用程序(不是Spring-boot,这有多大区别?)。部署在Tomcat7服务器上。 应用程序已启动并运行。我的问题是只能通过标准URL访问: http://mycompany.com:8081/cwing-0.0.3-snapshot/index.html 以下操作不起作用:http://mycompany.com:8081/cwing

  • 我希望从服务器加载数据并显示到我的应用程序中(

  • 问题内容: 我想通过请求中的项目填充日志记录上下文,例如:。我以为我可以在中间件的处理程序中覆盖Log类型。虽然它似乎不起作用,但我不确定为什么! 您能看到为什么在同一请求中对IIUC应该没有影响吗? 问题答案: 您需要对记录程序进行请求范围的检查。每当有新的连接进入时,就为整个处理程序全局设置它,这意味着您要进行数据争用以及通常不受欢迎的行为。 对于请求范围的上下文,请求中的嵌入是完美的。您可以