【问题标题】:ArrayIndexOutOfBoundsException while implementing Sieve of EratosthenesArrayIndexOutOfBoundsException 在实施埃拉托色尼筛法时
【发布时间】:2012-10-29 16:05:49
【问题描述】:

当我运行我的程序时,出现以下异常:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
        at eraKevgiri.main(eraKevgiri.java:29)

这段代码有什么问题?

public static void main(String[] args) {
    int gSayi = 0;
    int kKok = (int) Math.sqrt(gSayi);
    boolean[] liste = new boolean[gSayi + 1];

    Scanner klavye = new Scanner(System.in);
    System.out.println("Sayı Girin:");
    gSayi = klavye.nextInt();

    for(int i=2; i<=kKok; i++){
        System.out.println("" +i);
        for(int j=i*i; j<=gSayi; j+=i){
            liste[j] = true;
        }
    }

    for(int k=kKok; k<=gSayi; k++){ 
        if(!liste[k]){ //-------> problem in here
            System.out.println("" + k);
        }
    }
    klavye.close();
}

【问题讨论】:

  • 您的数组没有您尝试访问的索引。尝试在您的代码中添加断点并在调试中查看数组的值,以验证您在数组中是否有您期望的值..
  • 只是一个问题...非常离题但是...第一个“for”语句有什么作用吗?因为您似乎在骑自行车 i=2 并且 kKok 已设置为 0 的 sqrt,即 0...
  • @Noya 是的。您需要它们用于“eratosthenes 筛”算法。否则你无法到达(用户输入的)所有素数。

标签: java exception sieve-of-eratosthenes


【解决方案1】:

你应该搬家

Scanner klavye = new Scanner(System.in);
System.out.println("Sayı Girin:");
gSayi = klavye.nextInt();

到方法的开头,否则数组总是只有一个元素,然后当然没有索引为1的元素。

【讨论】:

    【解决方案2】:

    您首先分配一个大小为gSayi + 1 的数组,即0 + 1 = 1。稍后,您修改gSayi 并尝试访问liste 的元素,该元素只有一个元素。

    因此,您不得修改 gSayi 或将您的数组调整为修改后的值。

    【讨论】:

      【解决方案3】:

      你做事的顺序不对。当你打电话时:

      boolean[] liste = new boolean[gSayi + 1];
      

      您正在创建一个只有一个元素的数组,因为这里的gSayi + 1 始终是1。像这样移动你的代码:

      Scanner klavye = new Scanner(System.in);
      System.out.println("Sayı Girin:");
      int gSayi = 0;
      gSayi = klavye.nextInt();
      int kKok = (int) Math.sqrt(gSayi);
      boolean[] liste = new boolean[gSayi + 1];
      

      数组的大小不会因为您更新gSayi 而改变。与kKok 类似,它不会更新为gSayi 的新平方根。它将使用该时间实例的值。

      【讨论】:

        【解决方案4】:

        for(int k=kKok; k&lt;=gSayi; k++) 这里 gSayi 的值取自用户。因此,如果它大于 1,则会引发错误,因为 boolean[] liste 的大小为 1。这就是 liste[k] 超出范围的原因。

        您应该将liste 设为动态,例如列表。

        【讨论】:

          猜你喜欢
          • 2023-03-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-08
          • 2011-12-16
          相关资源
          最近更新 更多