Почему этот цикл while выполняется бесконечное количество раз?

1

У меня есть цикл 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());
}

Может ли кто-нибудь помочь мне понять, почему это так?

  • 1
    Я рекомендую вам установить Eclipse (или любую IDE, которую вы используете), чтобы предупредить вас, когда у вас есть логическое назначение в блоке if / while.
  • 1
    это может быть какое-то время (Exist == false ... вместо Exist = false ????
Теги:
do-while

6 ответов

6
Лучший ответ

Потому что вы назначаете Exist = false в цикле do-while while. Это должно быть Exists == false или лучше: !Exist:

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

Помимо этого, пожалуйста, следуйте соглашениям Java Code (старые, но все еще используемые), где переменные должны быть объявлены с верблюжьим футляром, но начиная с строчных букв.


Повторяя больше кода, вы никогда не читаете другую строку своего файла и логику для своего использования 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);
  • 0
    Я изменил это, и он все еще проходит цикл бесконечное количество раз ??
  • 0
    Ответ @James обновлен.
Показать ещё 1 комментарий
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.
        }
    }
2

Вы не перечитываете свою переменную line внутри своего цикла, поэтому line != null всегда верна.

  • 0
    +1, хороший улов, даже поскользнулся. Не удалось увидеть, что однажды прогуливаясь по вставленному коду :-)
2

Exist = false - это корень всего зла. = - оператор присваивания, а == - оператор сравнения равенства.

1

Ваш код - wron в этой строке:

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

Это должно быть:

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

В вашей версии вы назначаете false Exist и вы не сравниваете это.

1

Вы не оцениваете Exist в отношении значения false, вы присваиваете переменной значение false. Странно, что с условным или неправильным не происходит ничего плохого, но вы сможете исправить это, установив строку в

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

Я также могу ошибаться, потому что поздно, и я на iPad, но это "пока" на правильном уровне? Возможно, это будет одна фигурная скобка.

  • 0
    Нет, это на правильном уровне, я не учел.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню