仅在某些情况下从 java 中的值列表抛出异常

Dee*_*Das 1 java null loops list arraylist

我有一个值列表,最多包含四个元素。我需要循环遍历列表,并且仅在某些情况下才需要抛出异常。需要抛出异常的不同场景如下。

  1. 当空值出现在列表中间时。一些例子是:
 List<String> values = ["test1","test2",null,"test4"];
 List<String> values = ["test1",null,"test3","test4"];
 List<String> values = ["test1",null,null,"test4"];
Run Code Online (Sandbox Code Playgroud)
  1. 当空值出现在列表的开头时。一些例子是:
List<String> values = [null,"test2","test3","test4"];
List<String> values = [null,null,"test3","test4"];
List<String> values = [null,null,null,"test4"];
Run Code Online (Sandbox Code Playgroud)

所有其他情况都是有效的,不应引发异常。有效案例有:

List<String> values = ["test1","test2","test3","test4"];
List<String> values = ["test1","test2","test3",null];
List<String> values = ["test1","test2",null,null];
List<String> values = ["test1",null,null,null];
List<String> values = [null,null,null,null];
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

use*_*er7 5

您应该确保 null 后面不存在非 null 元素。否则,你会抛出异常

boolean nullSeen = false;
for (String s : list) {
    if (s == null) {
        nullSeen = true;
    } else if (nullSeen) { // for a non-null string
        throw new RuntimeException("Non-null value followed a null");
    }
}
Run Code Online (Sandbox Code Playgroud)

对于每个元素,我们检查它是否为,如果是,我们设置布尔标志nullSeennullSeen如果我们遇到一个已经设置为true的非空字符串,我们会抛出异常。


如果您使用 Java 9+ 并且更喜欢基于流的解决方案,那么我们可以使用dropWhile方法。

boolean noNonNullValueAfterNull = list.stream()
            .dropWhile(Objects::nonNull) //dropWhile(s -> s != null)
            .allMatch(Objects::isNull); //allMatch(s -> s == null)

if (!noNonNullValueAfterNull) {
    throw new RuntimeException("Non-null value followed a null");
}
Run Code Online (Sandbox Code Playgroud)

从列表中创建的流中,它会删除元素的前缀,直到看到null。流中的其余元素必须为null才能使返回值为true

注意:对于空流(全部为空),它将返回true,这也是我们想要的。