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

android Nullpointerexception,意图数据始终为空

曹旭
2023-03-14

我正在创建一个应用程序,它包含3个活动,比如说,A,B和c。活动A是主活动,它在应用程序打开时启动。

使用startActivityForResult(intent,1)将活动A称为活动B;活动B返回一个成功捕获的结果,在活动a的onActivityResult中,我使用startActivityForResult(intent2,2)启动活动C;

这是我的活动A的onActivityResult

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    Log.d("MAIN","Inside on activity result requestCode is : " + requestCode);
    if(requestCode == 1){
        if(resultCode == RESULT_OK){
            Log.d("MAINACT", "Inside RESULT CODE OK");
            if(data.getStringExtra("puzzleID")!=null){
                Log.d("MAINACT", "Inside puzzle has been selected");
                String puzzleIdResult = data.getStringExtra("puzzleID");
                Intent puzzleIntent = new Intent(MainActivity.this, TrialActivity.class);
                puzzleIntent.putExtra("puzzleID", puzzleIdResult);
                startActivityForResult(puzzleIntent, 2);
            }
         }
    }else if(requestCode == 2){
         Log.d("MAINACT", "Inside request code is 2 result code is : " + resultCode);
         if(resultCode == 0){
             if(data!=null){
             Log.d("MAINACT", "Inside STATUS NOT NULL");
             String puzzleStatus = data.getStringExtra("status");
             Log.d("MAINACT", "Puzzle status retrieved is : " + puzzleStatus);
             if(puzzleStatus.equals("pause")){
                 Log.d("MAINACT", "Inside puzzle status is paused");
             }
    }else{
          Log.d("MAINACT", "Data is null!!");
    }
}

这是活动C的返回结果意图

@Override
protected void onPause() {
    super.onPause();
    Log.d(TRIALTAG, "On Pause CALLED");
        Log.d(TRIALTAG, "Sending Intent");
        String puzzleID = Integer.toString(puzzle_ID);
    Intent returnPause = new Intent();
    returnPause.putExtra("status", "pause");
    returnPause.putExtra("puzzleid", puzzleID);
    if(getParent() == null){
        setResult(Activity.RESULT_OK, returnPause);
    }else{
        getParent().setResult(Activity.RESULT_OK, returnPause);
    }
    finish();
 }

从活动C返回时,我得到一个nullpointerexception,以及语句。

java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=2, result=0, data=null} to activity 
{com.mypackagename.sudoku/com.mypackagename.sudoku.MainActivity}: java.lang.NullPointerException

我稍后输入数据!=null检查以防止崩溃。我得到的数据是空的!!现在每次我在活动C中暂停。在阅读了SO上的其他解决方案后,我尝试了getParent方法,但这无济于事。为什么我的数据在活动 B 中设置,而不是在活动 C 中设置?这是我的第一个成熟的应用程序,所以请原谅任何无知。

共有2个答案

富凯风
2023-03-14
@Override
protected void onDestroy() {
    Log.d(TRIALTAG, "On Pause CALLED");
    Log.d(TRIALTAG, "Sending Intent");
    String puzzleID = Integer.toString(puzzle_ID);
    Intent returnPause = new Intent();
    returnPause.putExtra("status", "pause");
    returnPause.putExtra("puzzleid", puzzleID);
    if (getParent() == null) {
        setResult(Activity.RESULT_OK, returnPause);
    } else {
        getParent().setResult(Activity.RESULT_OK, returnPause);
    }
    super.onDestoy();
}

尝试使用这个。我用onDestroy代替了onPounge并删除了完成。并在最后调用了supoer.onDestroy。

长孙沈义
2023-03-14

似乎没有调用html" target="_blank">setResult()方法,因为根据异常设置的结果代码为0(result_cancelled),而不是-1(result_OK)

你确定你的activity C没有在Integer.toString(puzzle_ID)崩溃??

调试活动C的pounge()方法将帮助您解决崩溃。

P.S:这就是为什么你应该避免使用像if(resultCode == 0)这样的幻数。

PS:仅供参考,RESULT_CANCELED(0):如果子活动因任何原因(例如崩溃)而失败,则父活动将收到代码RESULT_CANCELED的结果。

更新

在onPause()或onDestroy中设置结果无效。在onBackPressed()或onFinish()中设置结果

看到此结果未在 onPause() 中使用 setResult() 按“后退”按钮时设置

 类似资料:
  • 我正在使用FCM进行消息推送,我正在将数据从通知发送到我正在打开的活动。 建筑通知规范: 在我的活动中,我得到了如下意图: 但问题是,每次Intent Extras在活动中为空时,我都检查了我在社区中找到的所有可能的原因,但每次响应都是相同的。 我试过下面提到的链接 Intent的额外值始终为空 Android通知PendingIntent Extras null 总是从通知意图android获取

  • 我的代码中有以下工作流程。我有,它启动一个新的使用starActivityForResult(意图,请求代码)。活动B有一个片段,比如,它包含一个listview(它的适配器有一个arraylist)和下面的编辑文本,可以将新值添加到listview中。 我打算将数据发送回。我在中实现了一个接口,该接口在同一片段的onPause()方法中调用。 子任务是在“编辑文本”中从“添加”按钮添加新项时更新

  • 问题内容: SQL Server数据库ID是否始终为正? 如sysdatabases中的dbid中所述。 这个问题与标识列或主键无关。 问题答案: 编辑,因为您更改了问题。 在此查询中:SELECT名称,来自master.dbo.sysdatabases的dbid。dbid的值始终为正,因为它被定义为1,1身份。

  • 下面是片段。请注意,我已经恢复到以前的提交,因此丢失了最近的修改,但请查看我编写的代码,然后才注意到始终等于0() 以下是当检测到活动后按: 以下是NoteActivity接收结果调用的方式。 null 我在我的项目上浪费了很多重要的时间,只是想知道是什么使resultCode和requestCode的值丢失了我发送的值。 任何帮助和指导都将不胜感激。非常感谢!

  • 我是Android开发的新手,我的Android Studio 3.1.3演示项目或我创建的任何项目都有这个问题。 尽管我可以在我的设计视图(ConstraintLayout)上拖放不同的控件,但在设计视图上没有显示任何内容,但它会显示一秒钟,然后消失。 我可以看到所有的元素,我拖放在activity_main.xml文本选项卡,组件树,甚至在运行模式,但不是在设计选项卡,什么都没有显示在设计视图

  • 问题内容: 我想了解Java 类型如何将其值存储在Java的内存中。当我运行以下代码时,我得到意外的输出: } 输出: 为什么不等于? 我也尝试了其他不同的值,但有时会返回预期结果,而有时则不会。 问题答案: 尽管您可能听说过舍入错误,但您可能想知道为什么这里有舍入错误。 版画 如您所见,这两个值都不能精确表示,并且在打印float或double时,会发生一些舍入操作以将其隐藏起来。在float的