【问题标题】:ArrayList: IndexOutOfBounds exception issueArrayList:IndexOutOfBounds 异常问题
【发布时间】:2015-02-19 06:50:30
【问题描述】:

我正在编写一个程序来查找素数。我将素数和所有正整数(现在直到 100)存储在两个 ArrayList<Integer> 中。代码如下:

import java.util.ArrayList;
public class PrimeNumbers { 
static ArrayList<Integer> num = new ArrayList<Integer>();
static ArrayList<Integer> prime = new ArrayList<Integer>();
public static void main(String[] args) {
    prime.add(2);
    prime.add(3);
    prime.add(5);
    for (int z = 1; z<=100; z++){
        num.add(z);
    }
    outer: for (int a = 1; a <=num.size(); a++){
        inner: for (int b = 1; b <=prime.size(); b++){
            if (num.get(a)%prime.get(b) != 0){//line 14
                if (prime.indexOf(b)+1 == prime.size()){
                    prime.add(a);
                    continue outer;
                }
                else 
                    continue inner;
            }
            else
                continue outer;
        }
    }
    System.out.println(prime);

    }
}

但是当我运行程序时,会出现这些错误:

线程“主”java.lang.IndexOutOfBoundsException 中的异常:索引:3,大小:3 在 java.util.ArrayList.rangeCheck(ArrayList.java:653) 在 java.util.ArrayList.get(ArrayList.java:429) 在 PrimeNumbers.main(PrimeNumbers.java:14)

出了什么问题?

【问题讨论】:

  • 您可能对我的简短java debugging tutorial 感兴趣。我什至以 IndexOutOfBoundsException 为例。此外,您可能不应该使用 goto(继续 x)。
  • 转到继续?
  • 是的,正如您正在使用的定向继续,以及标签。它或多或少是一个遗物。
  • 你能告诉我另一种方式吗?
  • 是的,您只需使用 continuebreak 并编写您的代码,以便与它们一起使用。

标签: java arraylist indexoutofboundsexception


【解决方案1】:

列表索引从 0 运行到 size()-1,但您从 1 循环到 size()

【讨论】:

  • 像这样重写你的循环:for (int a = 0; a &lt;num.size(); a++).
【解决方案2】:

Collection 的第一个元素的索引为 0,而不是 1。因此,例如,访问第三个元素应该使用collection.get(2)

你的循环应该像下面这样迭代:

outer: for (int a = 0; a < num.size(); a++){
    inner: for (int b = 0; b < prime.size(); b++){
        ...
    }
}

注意严格的 (&lt;) 索引比较。此外,还有以下更简单的方法:

outer: for (Integer numItem : num){
    inner: for (Integer primeItem : prime){
        ...
    }
}

这个for 循环形式迭代整个集合。

【讨论】:

  • 您忽略了将&lt;= 更改为&lt;
  • 我更改了它们,但它没有返回 0 到 100 之间的素数,它只是显示起始列表 ([2,3,5])
  • 您的问题可能与 Java 无关。给你的建议:养成在编码之前思考/写下你的算法的习惯
【解决方案3】:

尝试使用 Double 而不是 Integer。 (注意 Double 是一个大写“D”的对象)。

【讨论】:

    猜你喜欢
    • 2022-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2016-06-27
    相关资源
    最近更新 更多