【问题标题】:NullPointerException for Android JavaAndroid Java 的 NullPointerException
【发布时间】:2013-03-08 12:57:50
【问题描述】:

我有一个与当前问题类似的上一个问题,那是当我从我的字符串数组中检索空值时,现在我的问题是我认为我也从我的整数数组中获取空​​值,但我没有知道如何处理这样的异常,例如:

for int(i=0;i<n;i++)
    {
        if(taskArr[i] != null){
        taskArr[i] = taskArray[i].getText().toString();
        taskId[i] = taskArray[i].getId();
    }
    }

if(taskArr[i] != null) 解决了我从字符串数组中获取空​​值的问题,但它似乎不适用于我的整数数组。 taskArr[] 是我的字符串数组,taskId[] 是我的整数数组,taskArray[] 是一个编辑文本数组

【问题讨论】:

  • 整数数组不能包含空值(除非您使用 Integer[] 而不是 integer[])。如果这些是整数数组,这是如何工作的? taskArray[i].getText()
  • 对不起,我忘了说 taskArray[] 是一个编辑文本数组
  • 不要只在cmets中提到这个,编辑问题并添加它。

标签: java android eclipse nullpointerexception runtimeexception


【解决方案1】:

条件 if 语句只适用于需要使用括号的第一行。一般来说,在 if 语句中使用括号是一种很好的做法,它使事情更直观,并且可以避免遇到这样的错误。您还需要检查 getText() 是否不为空。

for int(i=0;i<n;i++)
    {
        if(taskArr[i] != null && taskArr[i].getText() != null)
        {
           taskArr[i] = taskArray[i].getText().toString();
           taskId[i] = taskArray[i].getId();
        }
    }

在旁注中,您提到您的数组包含Integer 对象。我在 API 文档中没有看到 Integer.getText()Integer.getId() Integer 是另一种存储在数组中的类型吗?

【讨论】:

  • 即使使用大括号,我也会收到 nullpointerexception 错误):
  • @AnthonyWu 那是因为 getText() 可能为空,我以为您使用的是整数数组,我会更新。
  • @AnthonyWu 检查我的答案,我认为这是你的问题。您应该在问题中提供更多详细信息,例如完整的堆栈跟踪。
  • 或者 getId() 可能为空...这个问题太模糊,无法回答。
【解决方案2】:

你评论过:

我仍然收到语法错误...

这不是有效的 Java:

for int(i=0;i<n;i++) {
}

应该是:

for (int i = 0; i < n; i++) {
}

至于其余部分,如果您确切地告诉我们 NPE 被扔在哪条线路上,我们可能会告诉您它是什么原因造成的。您似乎在暗示这是这一行:

    taskId[i] = taskArray[i].getId();

如果是这样,并且如果taskIdtaskArray 具有int[]EditText[] 类型,那么有3 种可能性:

- `taskId` is `null`,
- `taskArray` is `null`, or 
- `taskArray[i]` is `null`.

如果我们假设上一行:

    taskArr[i] = taskArray[i].getText().toString();

没有抛出 NPE,这消除了两种可能性,将 taskId 作为罪魁祸首。


我想说的另一条评论是,所有这些针对空值的测试以避免 NPE 很可能是错误的方法。您应该找出这些null 值的来源并更改其余代码的逻辑,以免发生这种情况。

【讨论】:

    【解决方案3】:

    这是因为int 不能是null,但Integer 可以。我假设你的taskArray.getId() 返回一个Integer,但taskIdint[]。因此,您将直接投射到int,如果Integernull,这将失败。这一行

    taskId[i] = taskArray[i].getId();
    

    等价于

    taskId[i] = taskArray[i].getId().intValue();
    

    如果taskArray[i].getId() 为空会发生什么?

    您需要获得一个Integer,检查它是否为null,如果不是null,则分配给一个int。例如:

    Integer id = taskArray[i].getId();
    if (id != null) {
        taskId[i] = id;
    }
    

    【讨论】:

      【解决方案4】:

      您应该将两行都包含在if 条件中:

      if(taskArr[i] != null)
      {
          taskArr[i] = taskArray[i].getText().toString();
          taskId[i] = taskArray[i].getId();
      }
      

      【讨论】:

        【解决方案5】:

        请在 if 子句中使用大括号 ({})。如果不这样做,则仅识别条件下的行:

        if(taskArr[i] != null) {
            taskArr[i] = taskArray[i].getText().toString();
            taskId[i] = taskArray[i].getId();
        }
        

        【讨论】:

          【解决方案6】:

          好吧,您检查taskArr 是否为空,然后尝试从taskId 中提取一个值。 taskId 可能是 null,或者至少是其中的值。你也需要检查一下。

          试试这个:

          for int(i=0;i<n;i++)
          {
              if(taskArray[i].getText() != null) //Check if Text from taskArray[i] is null
                  taskArr[i] = taskArray[i].getText().toString();
              if(taskArray[i].getId != null) //Check if ID from taskArray[i] is null
                  taskId[i] = taskArray[i].getId();
          }
          

          【讨论】:

          • 我试过 if(taskId[i] != null 但代码出现语法错误
          • @Anthony Wu 对不起,我忽略了一些事情。你可以试试这个代码吗?
          猜你喜欢
          • 1970-01-01
          • 2016-04-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多