【问题标题】:java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0java.lang.IndexOutOfBoundsException:索引 0 超出长度 0 的范围
【发布时间】:2021-09-14 04:07:27
【问题描述】:
import java.util.*;
 class stockbuysell{
    //Function to find the days of buying and selling stock for max profit.
    public static void main(String []args){
        int A[] = {100,180,260,310,40,535,695};
         ArrayList<ArrayList<Integer>> al = stockBuySell(A,7);
    }
    static ArrayList<ArrayList<Integer> > stockBuySell(int A[], int n) {
        // code here
       // buy = 0;
        //sell = 1
        ArrayList<ArrayList<Integer>> al = new ArrayList<ArrayList<Integer>>();
        int flag = 0;
        int idx = 0;
        for(int i=1;i<n;i++){
            if(i==n-1 && flag==1){
                al.get(idx).add(i);
                flag = 0;
            }
            if(flag == 0 && A[i]>A[i-1]){//
                al.add(new ArrayList<Integer>());
                al.get(idx).add(i-1);
                flag = 1;
            }
            if(flag == 1 && A[i]<A[i-1]){//
                al.get(idx).add(i-1);
                flag = 0;
                idx++;
            }
        }
        for(int i=0;i<al.size();i++){
            System.out.println(al.get(i).get(0)+" "+al.get(i).get(1));
        }
        return al;
    }
}

我不知道哪里出错了。编译成功,运行时显示:

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:266)
        at java.base/java.util.Objects.checkIndex(Objects.java:359)
        at java.base/java.util.ArrayList.get(ArrayList.java:427)
        at stockbuysell.stockBuySell(stockBuySell.java:32)
        at stockbuysell.main(stockBuySell.java:6)

【问题讨论】:

  • 我认为这对你有好处,如果你调试它。这将帮助您更好地理解它。你想在代码中做什么?
  • al.get(i).get(0) 是罪魁祸首。从视觉上看,这是您发布的第 32 行。 al 的第 i 个元素是一个空数组。 for 循环中的 3 个 if 语句不保证添加任何内容。
  • 不确定你的算法是做什么的,但问题是最后一次循环。它设置flag=0但不增加idx,并且紧接着它会向arraylist添加一个新元素,但idx仍然引用之前的条目,并且没有添加到最后一个arraylist
  • 在最后一个 for 循环中从 al.size() 中减去一个单位:for(int i=0;i&lt;al.size()-1;i++)...

标签: java exception arraylist


【解决方案1】:

您的 arraylist 有一些空列表,如果您访问它,它将抛出 IndexOutOfBoundsException。

在访问该索引之前,请务必检查该索引中是否存在数据。

【讨论】:

  • 数组在代码中被初始化,它的长度在 System.out.println(al.get(i).get(0)+" "+al.get(i).get 中不匹配(1));。这里 get(0) 和 get(1) 正在中断代码。
  • 始终建议不要硬编码任何索引值以进行访问,即使必须,也应在访问之前检查该值是否存在。
  • 您的外部arraylist 在代码中已初始化,但是您添加了一个arrayList,当您尝试读取它时它仍然为空。我不确定这段代码应该做什么,但我建议在调试器中单步执行它,以找出它的行为与您期望的不同。我还建议对“标志”使用布尔值,而不是在 1 和 0 之间交替。这使代码更易于阅读和理解。如果您要寻求帮助,更具描述性的变量名称也会有所帮助。
猜你喜欢
  • 2022-10-15
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2012-04-07
  • 2022-12-18
  • 1970-01-01
相关资源
最近更新 更多