【问题标题】:java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 Java 8java.lang.IndexOutOfBoundsException:索引:0,大小:0 Java 8
【发布时间】:2018-09-10 11:05:58
【问题描述】:
ABC abc = eMsg.getAbcCont().stream()
                        .filter(cnt -> (option.geiID().equals(cnt.getId()) && option.getIdVersion() == cnt.getIdVersion()))
                        .collect(Collectors.toList()).get(0); 
delEmsg.getAbcCont().remove(abc);

上面的代码给了我一个例外

java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)

getAbcCont 方法将返回 ABC 对象列表。目前我的 eMsg 包含两个带有 getAbcCont 的对象。当控制达到.collect(Collectors.toList()).get(0); 时,它会给出上述异常。任何帮助建议都必须得到认可。

【问题讨论】:

标签: java-8


【解决方案1】:

这意味着过滤后的结果是零元素,所以你不能做get(0)

对此的快速解决方案是首先取回元素列表,然后检查是否至少有一个元素。

List<ABC> list = ABC abc = eMsg.getAbcCont().stream()
                        .filter(cnt -> (option.geiID().equals(cnt.getId()) && option.getIdVersion() == cnt.getIdVersion()))
                        .collect(Collectors.toList());

if(list.size() > 0){
 ABC abc = list.get(0);
}

显然还有一种更短的方法也可以使用 lambda,例如:

ABC abc = eMsg.getAbcCont().stream()
                        .filter(cnt -> (option.geiID().equals(cnt.getId()) && option.getIdVersion() == cnt.getIdVersion()))
                        .collect(Collectors.toList()).findFirst().orElse(null)

参考:https://stackoverflow.com/a/26126636/1688441

但作为用户 nullpointer ,您可能需要在尝试使用对象 abc 调用 remove() 之前检查是否找到了元素。我怀疑尝试从集合中删除 null 可能无济于事,但您可以检查以确保!

if(abc != null){
 delEmsg.getAbcCont().remove(abc);
}

【讨论】:

  • 我认为您在问题中错过了delEmsg.getAbcCont().remove(abc);...orElse(null) 可能会导致此处出现 NPE。
【解决方案2】:

根据声纳,您应该使用 !list.isEmpty() 而不是 list.size()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多