У меня есть цикл 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());
}
Может ли кто-нибудь помочь мне понять, почему это так?
Потому что вы назначаете 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);
Другая проблема: в
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.
}
}
Вы не перечитываете свою переменную line
внутри своего цикла, поэтому line != null
всегда верна.
Exist = false - это корень всего зла. = - оператор присваивания, а == - оператор сравнения равенства.
Ваш код - wron в этой строке:
while(Exist = false || line != null);
Это должно быть:
while(Exist == false || line != null);
^^^^
В вашей версии вы назначаете false
Exist
и вы не сравниваете это.
Вы не оцениваете Exist в отношении значения false, вы присваиваете переменной значение false. Странно, что с условным или неправильным не происходит ничего плохого, но вы сможете исправить это, установив строку в
while(Exist == false || line != null);
Я также могу ошибаться, потому что поздно, и я на iPad, но это "пока" на правильном уровне? Возможно, это будет одна фигурная скобка.