代码之家  ›  专栏  ›  技术社区  ›  Zia

java.lang.IndexOutOfBoundsException异常:索引:0,大小:0 Java 8

  •  -1
  • Zia  · 技术社区  · 6 年前
    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);

    1 回复  |  直到 6 年前
        1
  •  4
  •   Menelaos    6 年前

    这意味着过滤器后的结果是零元素,因此您不能这样做 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);
    }
    

    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,您可能需要在尝试调用之前检查是否找到元素 remove()

    if(abc != null){
     delEmsg.getAbcCont().remove(abc);
    }
    
        2
  •  0
  •   Saurabh Sharma    4 年前

    你应该这么做!list.i空()而不是列表大小()根据声纳