【问题标题】:Out of bounds exception printing in for loop less than arraylist size in javafor循环中的越界异常打印小于java中的arraylist大小
【发布时间】:2019-04-03 18:07:19
【问题描述】:

即使我在 for 循环中明确指定我希望它在 arraylist.size 之前打印,终端也会返回 OutOfBounds 异常

public static void PrintPlayList() {
        int lengthsongs = songs.size();
        int lengthadds = adds.size();
        int amountadds = 0;

    for (int i = 0; i < lengthsongs; i++) {
        playlist.add(songs.get(i));
        if (amountadds < lengthadds) {
            playlist.add(adds.get(amountadds));
            amountadds++;
        }
    }

    int lengthplaylist = playlist.size();
    for (int i = 0; i < lengthplaylist; i++) {
        System.out.println(songs.get(i).toString());
        System.out.println(adds.get(i).toString());
    }
}

这就是编译器返回的:这怎么可能?我该如何解决?

java.lang.IndexOutOfBoundsException: Index: 18, Size: 18
    at java.util.ArrayList.rangeCheck(Unknown Source)
    at java.util.ArrayList.get(Unknown Source)
    at Main.PrintPlayList(Main.java:153)
    at Main.Interface(Main.java:55)
    at Main.main(Main.java:34)

【问题讨论】:

  • 第 153 行是哪一行?因为 get() 被调用了 3 次
  • @azro 第 153 行是 ; System.out.println(songs.get(i).toString())
  • Printsongs.size() 和adds.size() 会在几秒钟内解决你的问题,下次考虑一下;)

标签: java for-loop printing indexoutofboundsexception


【解决方案1】:

我认为问题出在这里:

for (int i = 0; i < lengthplaylist; i++) {
        System.out.println(songs.get(i).toString());
        System.out.println(adds.get(i).toString());
    }

lengthplaylist 可以大于代码中的lengthsongs。你正在使用 for 循环从 0 到 lengthplaylist 而不是 lengthsongs

您还应该注意adds.get(i).toString(),因为要执行此操作,所有长度必须相同。

您可以像这样在循环中为它们使用不同的变量:

for (int i = 0,j=0; i < lengthsongs && j<lengthadds; i++,j++) {
        System.out.println(songs.get(i).toString());
        System.out.println(adds.get(j).toString());
}

【讨论】:

    【解决方案2】:

    如果您使用调试器,您应该看到playlist 的元素比songsadds 的元素多,因为它是这些元素的总和(虽然不完全)这个错误是在运行时而不是编译时产生的.

    最简单的解决方案是

    public static void printPlayList() {
        playlist.clear();
        playlist.addAll(songs);
        playlist.addAll(adds);
        playlist.forEach(System.out::println);
    }
    

    或者只是

    public static void printPlayList() {
        songs.forEach(System.out::println);
        adds.forEach(System.out::println);
    }
    

    【讨论】:

      【解决方案3】:

      列表playlist 没有在PrintPlayList() 内部初始化,因此它可能包含之前的元素。
      在这个循环中:

      for (int i = 0; i < lengthsongs; i++) {
          playlist.add(songs.get(i));
          if (amountadds < lengthadds) {
              playlist.add(adds.get(amountadds));
              amountadds++;
          }
      }
      

      您将songs 的所有元素添加到playlist,所以playlist 的元素数量至少与songs 一样多,但它是否包含更多元素?我不知道,但你可以通过调试找到。
      这同样适用于列表adds
      它们的尺寸都一样吗?这个循环:

      for (int i = 0; i < lengthplaylist; i++) {
          System.out.println(songs.get(i).toString());
          System.out.println(adds.get(i).toString());
      }
      

      如果它们的大小相同或 playlist 的大小小于其他 2 个列表,则将成功。

      【讨论】:

        【解决方案4】:

        Java 中的 ArrayList 从 0 开始索引。您正在访问索引 18,但是您的列表包含从 0 到 17 的元素。

        由于您将songsadds 存储在playlists 中,因此您可以像这样直接从playlist 打印它们:

        for (int i = 0; i < lengthplaylist; i++) {
            System.out.println(playlist.get(i).toString());
        }
        

        【讨论】:

        • 是的,我知道,但是我怎么才能只取到 17 点,这就是我要做什么?
        • @J.Doe 将长度设为songs 中的元素数而不是playlist
        • 我认为歌曲和添加列表大小不同...首先检查一下。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-22
        • 1970-01-01
        • 1970-01-01
        • 2011-09-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多