在ArrayList中替换空值

3

我尝试替换ArrayList中的null值,但出现异常。

java.lang.NullPointerException

我尝试了不同的方法:

Data.replaceAll(s -> s.replaceAll(" null", "")); 

并且:

for(int x = 0; x < Data.size(); x++)
          {
                if(Data.get(x).equals("null") == true)
                {
                    Data.set(x, "");
                }
          }

并且:

for(int x = 0; x < Data.size(); x++)
          {
                if(Data.get(x).equals(null) == true)
                {
                    Data.set(x, "");
                }
          }

但是抛出了一个异常:java.lang.NullPointerException

这里是我的ArrayList的例子:

[0050568D6268, null, A001, A, T3, Principal, COL - Test, 4-Lock, Com. On Stage, Social, RDC, null, null, null, null, -1, null, -1, 0, -1, 99, 53]

我在寻求任何帮助,谢谢。


1
null"null" 是两个非常不同的东西。 - Tom
我尝试了 null 和 "null"。 - PandaRasta
1
你为什么认为当 Data.get(x) 为空时,Data.get(x).equals(null) 不会抛出异常?自从什么时候人们可以在空对象上调用 .equals 这样的方法? - Tom
@GhostCat 当然,但我尝试了所有经过我的解决方案 :) - PandaRasta
@Tom 我以为它可以这样工作,但我错了。 - PandaRasta
显示剩余4条评论
4个回答

5
你的列表中的值似乎是实际的 null,而不是带有 "null" 字符串。你可以使用以下方法将其替换为 ""
data.replaceAll(t -> Objects.isNull(t) ? "" : t);

您可以使用以下方式来移除它们:
data.removeIf(Objects::isNull)

我不想删除它,我想用空字符串替换它。 - PandaRasta
1
@PandaRasta 已添加到答案中。 - rdas

5

我认为你想在这里使用map()

// given list data
data = data.stream()
    .map(s -> Objects.isNull(s) ? "" : s)
    .collect(Collectors.toList());

这会返回一个与输入相同的列表,但所有的null值都被替换为空字符串。


如果您不需要用默认值替换空元素,也可以使用.filter(Objects::nonNull)来排除空元素。 - JonK
1
@JonK 是的,但我理解 OP 的意思是他想要替换并保留原来的 null 值。 - Tim Biegeleisen
@Tim Biegeleisen 确切无误 - PandaRasta

2

在Java中,我们不能在空对象上调用任何方法,这就是为令你遇到NullPointerException的原因。

下面这行代码会抛出NullPointerException异常,因为在Java中,不允许在空对象上调用equals方法。

Data.get(x).equals("null")

所以将上面的内容替换为下面的内容即可解决问题。
Data.get(x) == null

此外,与 == true 进行额外比较是不必要的。

2

在这行代码中,你正在将位置x的值与字符串null进行比较,而不是“与空值进行比较”:

if(Data.get(x).equals("null") == true)

将此比较替换为:

if(Data.get(x) == null)

完美运行!我接受这个解决方案。为什么Data.replaceAll(s -> s.replaceAll(null, ""));会抛出异常?因为我在另一个程序中完全按照这种方式使用它,并且它可以正常工作。 - PandaRasta
它抛出异常是因为你在调用s.replaceAll时试图在一个空对象上调用replaceAll - Gustavo
1
你应该按照@rdas在他的回答中建议的方式操作:Data.replaceAll(s -> Objects.isNull(s) ? "" : s); - Gustavo
是的,但我不明白的是它正在使用另一个ArrayList,并混合了null值和字符串值。 - PandaRasta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接