【问题标题】:Java - Why is this an infinite loop and how can I fix it?Java - 为什么这是一个无限循环,我该如何解决?
【发布时间】:2014-11-15 21:28:26
【问题描述】:

这是我目前正在处理的一个程序的小 sn-p,该程序正在发生无限循环。当它遇到这个循环时,我已经将所有变量设置为它们在程序中的值。这个循环的目标是让它要么中断(当然它不会使用这些值)或者遍历整个循环然后继续,我相信它应该基于 for 循环中设置的条件,而是变成了一个无限循环。我迷路了,想知道是否有人可以帮助我。为什么这是一个无限循环,我该如何解决?谢谢。

第一个代码 sn-p 是显示无限循环的最小代码。我放 System.out.println("Infinite"); 的地方是发生无限循环的地方。它永远不会到达 for 循环中的 if 语句。我试过调试无济于事。

int e = 1;
int f = 0;
int q = 2;
int posInt = 10;
int[] Prime = new int[posInt];
Prime[0] = 2;
Prime[1] = 3;
Prime[2] = 5;
int stay = 0;

while(stay == 0){
    while(e <= posInt){
        if((q + 1) == Prime[f]){
            stay++;
            System.out.println("BREAKING");
            break;
        }
        e++;
        f++;
    }
    q++;
}

这是到目前为止的整个程序,以防万一。目标是通过使用埃拉托色尼筛法来测试用户输入的数字是否为质数。我意识到程序中可能存在其他错误并且可能不正确,但我仍在努力。目前我无法进步,因为我陷入了这个无限循环。

    int posInt;
    Scanner reader = new Scanner(System.in);

    System.out.print("Please enter in any positive integer greater than one to see if it is a prime number: ");
    posInt = reader.nextInt();
    System.out.println();

    int n = posInt;
    int q = 2;
    int a = 3;
    int b = 1;
    int[] list = new int[n];
    list[0] = 2;

    while(a <= n){
        list[b] = a;
        a++;
        b++;
    }


    int c = 2;
    int d = 0;
    int P = 0;
    int nP = 0;
    int[] notPrime = new int[n];
    int[] Prime = new int[n];


    while(c <= n){
        if(list[d] == q){
            Prime[P] = list[d];
            P++;
        }
        else if(list[d] % q == 0){
            notPrime[nP] = list[d];
            nP++;
        }
        else{
            Prime[P] = list[d];
            P++;
        }
        c++;
        d++;


        System.out.println("Primes numbers: ");
        int y = 1;
        int z = 0;
        while(y <= P){
            System.out.println(Prime[z]);
            y++;
            z++;
        }

        System.out.println("Numbers that are not prime: ");
        y = 1;
        z = 0;
        while(y <= nP){
            System.out.println(notPrime[z]);
            y++;
            z++;
        }


        int stay = 0;
        int e = 1;
        int f = 0;
        while(stay == 0){
            while(e <= posInt){
                if(!((q + 1) == notPrime[f])){
                    stay++;
                    break;
                }
                e++;
                f++;
            }
            q++;
        }
    }

    int g = 2;
    int h = 0;
    boolean prime = false;
    while(g <= n){
        if(posInt == Prime[h]){
            prime = true;
            break;
        }
        g++;
        h++;
    }
    if(prime = true){
        System.out.println("The number " + n + " is prime.");
    }
    else if(prime = false){
        System.out.println("The number " + n + " is not prime.");
    }


    reader.close();

【问题讨论】:

  • 你试过调试程序看看它在哪里循环吗?
  • 请贴出显示无限循环的minimal代码sn-p
  • 请告诉我们您的程序在哪里循环。您可以通过使用调试器并单步执行代码或在代码中添加跟踪语句(例如使用 System.out.println)来找出循环,以便查看循环发生的位置。
  • 第一个代码 sn-p 是显示无限循环的最小代码。我放 System.out.println("Infinite"); 的地方是发生无限循环的地方。它永远不会到达 for 循环中的 if 语句。我试过调试无济于事。

标签: java infinite-loop sieve-of-eratosthenes


【解决方案1】:

无限循环不在第一个 sn-p 中,而是在周围的 while - 如果 break 从未发生,stay 也将始终为 0,除非其他操作之一抛出一个异常,你将永远被困在那里......

    int stay = 0;
    while(stay == 0){
        int e;
        int f = 0;
        for(e = 1; e <= posInt; e++){
            if((q + 1) == Prime[f]){
                stay++;
                break;
            }
            f++;
            System.out.println("Infinite");
        }
        q++;
    }

【讨论】:

  • 但是会不会因为for循环的条件,for循环最终会结束,变量q会递增,然后for循环又会运行呢?这是目标,但 for 循环永远不会退出。
  • for 循环正在结束,但随后又因为周围的while 而重新开始。我还没有通读您的所有代码以了解为什么,但我认为q+1 永远不会等于Prime[f] - 您可以尝试将它们打印出来。无论哪种方式,for 循环确实退出
  • 好吧,这更有意义。我已将代码从 for 循环更改为 while 循环,将 stay、e 和 f 变量移到了外部 while 循环之外,但它仍然以无限循环结束。
  • 如果有帮助的话,我在最小的 sn-p 代码上编辑了我的原始帖子。
  • 现在你没有增加e! :)
【解决方案2】:

您需要一种方法来停止您的 while 循环。所以在循环外声明int f,放到while条件中:

int stay = 0;
int f = 0;
while (f < posInt && stay == 0) {
    int e;
    for (e = 1; e <= posInt; e++) {
        if ((q + 1) == Prime[f]) {
            stay++;
            break;
        }
        f++;
        System.out.println("Infinite");
    }
    q++;
}

您必须查看其余代码中的逻辑(如您自己所述)

【讨论】:

    猜你喜欢
    • 2022-01-08
    • 2021-08-16
    • 2018-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多