java - while 循环创建无限循环,尽管条件在 java 中变为 false

标签 java while-loop

public class Sample {

    /**
     * @param args
     */
    int array[]= {1,2,3};


    //it is used to display the array in format as 3,2,1,2,1,1

    public void sampleFunction(int size)
    {

        while(size >= 0)
        {
            System.out.println(array[size]);
            sampleFunction(size-1);
        }
        //end while loop

    }
    //end sample function

    // starting main class

    public static void main(String[] args) {
        //creating object Sample

        Sample s = new Sample();

    //Calling sample function for display the array elements

        s.sampleFunction(2);
    }
    //end main class


}
//end sample class

最佳答案

Java 是 pass by value only 。您永远不会在 while 循环内更新 size 的值,因此 size 将始终大于 0。

public void sampleFunction(int size) {
    while(size >= 0) {
        System.out.println(array[size]);
        sampleFunction(size-1);
        //this fixes your code...
        size--;
    }
}
<小时/>

更好的是,由于您正在处理递归方法,因此只需删除其中的 while 即可:

public void sampleFunction(int size) {
    if (size <= 0) return;
    System.out.println(array[size]);
    sampleFunction(size-1);
}
<小时/>

使用while循环的问题是size的值永远不会改变。该方法的执行方式如下:

public void sampleFunction(int size) {
    //removed unnecessary code that doesn't generate problems
    while(size >= 0) {
        sampleFunction(size-1);
    }
}

public void main(String[] args) {
    sampleFunction(0); //it will be infinite like this...
}

现在,当您调用 sampleFunction(0) 时,将会发生以下情况:

  1. sampleFunction(0) 被调用。
  2. while 循环将检查 size(其值为 0)是否大于或等于 0。
  3. 由于它等于 0,因此将调用 sampleFunction(-1)
    3.1. sampleFunction(-1) 被调用。
    3.2. while 循环将检查 size(其值为 -1)是否大于或等于 0。
    3.3.由于不满足条件,因此不执行任何操作。
    3.4.完成 sampleFunction(-1) 执行。
  4. 返回到 while 检查。 size 值从未改变。返回到 2(从而得到无限循环)。

定义递归方法时的提示:

  • 始终在方法的顶部定义基本情况(如果不能在顶部,请尽快在方法中定义它)。
  • 完成设计后,用纸和铅笔(或钢笔)对其进行测试,并尝试在那里执行它(而不是在电脑中执行)。这将帮助您检查是否遗漏了某些内容。一旦您获得更多经验,您就可以更加信任设计并运行它(并希望它不会变得无限:P)。

关于java - while 循环创建无限循环,尽管条件在 java 中变为 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23087889/

相关文章:

java - 在不同网络上使用 RMI

java - 未找到当前线程的 session (Spring 3.1.X 和 Hibernate 4)

Java Scanner 类 - 无法退出 while 循环

似乎无法让我的 While 语句发挥作用

c - 如何从C中的数字中获取每个数字?

java - 做 "nothing"而 "condition"

python - 我的输入函数的两个版本,递归与 while 循环?

java - Spring 事件和服务重启

java - 这是 Java 中 ServiceLocator 模式的有效实现吗?

java - 使用 Spring 从 Splunk 读取数据