为什么while循环执行无限次?

时间:2014-08-31 07:50:50

标签: java do-while

我有一个while循环,它应该读取数组的元素以尝试找到给定variable的值,但是,循环执行自己无限次,我不明白为什么。它应该在找到它正在寻找的值后退出;我知道它确实找到了它正在寻找的东西,因为它打印出I've found it!无限次。该方法的代码到目前为止是:

try{
    System.out.println("Enter your card number to access your account:");
    int CardNumber = sc.nextInt();
    String CardNumberStr = Integer.toString(CardNumber);
    boolean Exist = false;
    String LineNo;
    String [] CardNum = {};
    int Counter;
    FileReader fileReader = new FileReader("VirtualATM.txt");
    BufferedReader bufferedReader = new BufferedReader(fileReader);
    line = bufferedReader.readLine();
    CardNum = line.split("\\s+");
    do{
        for(Counter = 0; Counter < CardNum.length; Counter++){
            LineNo = CardNum[Counter];
            if(LineNo.contains(CardNumberStr)){
                Exist = true;
                System.out.println("I've found it!");
            }
            else if(Counter == CardNum.length){
                Exist=false;
            }
        }
    }while(Exist = false || line != null);
    bufferedReader.close();
}catch(FileNotFoundException e){
    e.printStackTrace();
    System.out.println(e.getMessage());
}catch(IOException e){
    e.printStackTrace();
    System.out.println(e.getMessage());
}

任何人都可以帮我弄明白为什么会这样做吗?

6 个答案:

答案 0 :(得分:6)

因为您在Exist = false循环中分配了do-while。它应该是Exists == false或更好:!Exist

} while(!Exist || line != null);

除此之外,请遵循Java Code Conventions(旧的但仍然使用),其中变量应使用驼峰大小写声明,但以小写字母开头。


查看更多代码,您永远不会阅读文件的另一行,而do-while的逻辑应该使用AND(&&),而不是OR(||) 。只需将其添加到您的代码中:

line = bufferedReader.readLine();
CardNum = line.split("\\s+");
do{
    for(Counter = 0; Counter < CardNum.length; Counter++){
        LineNo = CardNum[Counter];
        if(LineNo.contains(CardNumberStr)){
            Exist = true;
            System.out.println("I've found it!");
        }
        else if(Counter == CardNum.length){
            Exist=false;
        }
    }
    //add this line to read another line of the file
    //and check if it exists
    line = bufferedReader.readLine();
} while(!Exist && line != null);

答案 1 :(得分:2)

存在=假是这里所有邪恶的根源。 =是赋值运算符,==是相等比较运算符。

答案 2 :(得分:2)

您未在循环中重新阅读line变量,因此line != null始终为真。

答案 3 :(得分:2)

另一个问题:在

    for(Counter = 0; Counter < CardNum.length; Counter++){

        LineNo = CardNum[Counter];
        if(LineNo.contains(CardNumberStr)){
            Exist = true;
            System.out.println("I've found it!");
        }
        else if(Counter == CardNum.length){
            Exist=false;
        }
    }

(Counter == CardNum.length)永远不会成立,因为Count值从0变为CardNum.length-1。由于Exist初始化为false,因此您无需再次将其设置为false。你可以删除else子句。

顺便说一下,你可以突破循环

    for(Counter = 0; Counter < CardNum.length; Counter++){
        LineNo = CardNum[Counter];
        if(LineNo.contains(CardNumberStr)){
            Exist = true;
            System.out.println("I've found it!");
            break.
        }
    }

答案 4 :(得分:1)

你的代码在这一行中是错误的:

while(Exist = false || line != null);

必须是:

while(Exist == false || line != null);
            ^^^^

在您的版本中,您将false分配给Exist并且您不进行比较。

答案 5 :(得分:1)

您没有根据值false评估Exist,而是将值false赋给变量。奇怪的是条件不会出现问题,或者说,但是你可以通过将线路设置为

来修复它。
      while(Exist == false || line != null);

我也可能是错的,因为它已经很晚了,我在iPad上,但就是那个&#34;而#34;在适当的水平吗?它可能需要一个大括号。