我有一个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());
}
任何人都可以帮我弄明白为什么会这样做吗?
答案 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;在适当的水平吗?它可能需要一个大括号。