【问题标题】:IndexOutOfBoundsException on a print statement打印语句上的 IndexOutOfBoundsException
【发布时间】:2018-03-19 12:30:28
【问题描述】:


我有一个触发异常IndexOutOfBoundsException 的打印语句。这是代码:
主要方法

public class AdvDotComLauncher {
    public static void main(String[] args) {
        AdvDotComTable table = new AdvDotComTable();
        table.createTable(5,5);
    }
}

表格类

import java.util.ArrayList;

public class AdvDotComTable {
    public boolean createTable(int rows, int columns) {
        if (rows == 26) {
            //When true is returned, the program will let the user know they have to choose a lower number
            return true;
        }
        String[] dotComs = {"Pets.com", "Amazon.com", "Target.com", "Apple.com", "Microsoft.com", "Steampowered.com"};
        ArrayList<Character> row = new ArrayList<Character>();
        ArrayList<Integer> column = new ArrayList<Integer>();
        char[] letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
        int number = 0;
        int rows2 = rows;
        int columns2 = columns;
        while (rows2 != 0 && columns2 != 0) {
            row.add(letters[number]);
            if(number == columns) {
                column.add(number);
                number = 0;
                columns2--;
            }
            System.out.println(row.get(number) + "" + column.get(number));
            number++;
            rows2--;
        }
        return false;
    }
}

错误

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index 0 out-of-bounds for length 0
    at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
    at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
    at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:248)
    at java.base/java.util.Objects.checkIndex(Objects.java:372)
    at java.base/java.util.ArrayList.get(ArrayList.java:439)
    at AdvDotComTable.createTable(AdvDotComTable.java:23)
    at AdvDotComLauncher.main(AdvDotComLauncher.java:4)

我不知道是什么导致了这个问题,我们将不胜感激。我是一名业余开发人员,只是想学习,所以这可能是一个愚蠢的错误(对此感到抱歉)。 在此先感谢,
生活

【问题讨论】:

    标签: java indexoutofboundsexception


    【解决方案1】:

    很明显你的代码

    System.out.println(row.get(number) + "" + column.get(number)); 
    

    会失败。

    与之前的代码一样,您正在将值添加到行列表中,在索引号处,但您的列列表仍然是空的,没有元素。如果列表没有元素,则预计会有异常。就像下面的代码

    List test = new ArrayList();
    System.out.println(test.get(0));
    

    【讨论】:

    • 嗨,我使用 column.add(0); 将“0”添加到列表中。但是,我仍然遇到 indexoutofbounds 异常。
    • 这个想法是一样的。如果您只向列表添加了一个元素并且调用 index > 0 ,那么您将获得异常。当您调用 get 时,请确保您传递的索引小于列表的大小。在您的问题中,数字的价值不断增加......
    【解决方案2】:

    ArrayList's get 方法的 API 对此非常清楚。

    抛出: IndexOutOfBoundsException - 如果索引超出范围 (index = size())

    在您的情况下,索引 >=size() 就是正在发生的事情。

    【讨论】:

    • 嗨,我用 column.add(0); 将“0”添加到列表中。但是,我仍然遇到 indexoutofbounds 异常。
    • @Lyfe。每次进入while循环时都添加它吗?问题是您每次都尝试打印 column.get() ,但它并不总是被填充。每次你都在增加“数字”。上次您为 index=0 获取 OutOfBound 时,在对 column.add(0) 进行硬编码后,您现在将在 index=1 处获取它,这意味着您通过了循环的第一次迭代,但在第二次迭代中失败了跨度>
    【解决方案3】:

    为了更好地了解您的代码何时失败,您可以在某些时候调试您的代码。这对于新开发人员学习和了解正在发生的事情非常有帮助。

    你也可以看看解释,然后去找鳕鱼失败的地方。错误的开始出现在第 23 行。

    System.out.println(row.get(number) + "" + column.get(number));
    

    你会得到IndexOutOfBoundException。这就是说您在某些时候试图超出数组的大小限制。所以,你可以做的就是在这里挖一个调试点,并添加一个案例进入调试,其中行或列大于或等于26并继续调试。

    【讨论】:

      【解决方案4】:

      IndexOutOfBoundException 在以下行抛出 e.i -

       System.out.println(row.get(number) + "" + column.get(number));
      

      由于 ArrayList column 中没有发生任何插入而引发的异常,并且它始终为空,这就是 column.get(number) 引发 IndexOutOfBoundException 异常的原因。

      如果您在 SOP 中进行如下更改,那么您会得到类似的输出 -

      System.out.println(row + " " + column);
      

      输出

      [A] []
      [A, B] []
      [A, B, C] []
      [A, B, C, D] []
      [A, B, C, D, E] []
      

      我认为问题在于 if 条件在第一次通过时为假,然后抛出异常检查 if 条件

         if(number == columns) {
              column.add(number);
              number = 0;
              columns2--;
          }
      

      【讨论】:

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