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

Throw exception only in some cases from a list of values in java

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

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

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

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];

有人可以帮忙吗?

您应该确保没有 non-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");
    }
}

对于每个元素,我们检查它是否为 null,如果是,我们设置布尔标志 nullSeen。如果我们遇到 non-null 字符串且 nullSeen 已经设置为 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");
}

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

注意:对于空流(所有空值),它将 return true 这也是我们想要的。