2014-08-31 3 views
1

나는 배열의 요소를 통해 주어진 값인 variable을 찾으려면 while 루프를 사용해야하지만, 루프는 무한히 반복되어 실행되며 이유는 알 수 없습니다. 찾고자하는 값을 발견하면 종료해야합니다. 지금까지, 그것은 그것이 방법에 대한 I've found it! 무한 times.The 코드를 출력하기 때문에 찾고 있는지 찾을 않습니다 알고왜 while 루프가 무한 시간 실행됩니까?

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

난 당신이 블록 동안/경우에 부울 할당이있을 때 경고 이클립스 (또는 어떤 IDE 사용)을 설정하는 것이 좋습니다의 탈옥 수 있습니다. – corsiKa

+1

Exist = false 대신 Exist == false ...이 될 수 있습니까? – mlwn

답변

6

Exist = falsedo-while 루프에 지정했기 때문에 !Exist : 그것은 더 좋은 방법 Exists == false 이상이어야한다 변수가 낙타 케이스로 선언하지만, 소문자로 시작해야하는 위치

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

이의 떨어져의 Java Code Conventions (오래된하지만 여전히 사용)하십시오. 더 코드를 검토


, 당신은 결코 당신의 파일의 또 다른 라인과 사용해야합니다 당신의 do-while에 대한 논리 AND (&&),하지 OR (||를) 읽는 없습니다 있습니다.

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

그것은해야합니다 :

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

에서는 버전이 false-Exist 당신을 할당

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

변경 했는데도 무한 루프가 반복됩니다. – James

+0

@James 대답이 업데이트되었습니다. –

+0

정말 대단합니다! 감사합니다. 너 – James

1

귀하의 코드는이 줄 wron입니다 : 그냥 코드에 이것을 추가 비교하지 마라.

2

Exist = false는 모든 악의 근원입니다. =은 대입 연산자이고 ==는 항등 비교 연산자입니다.

1

Exist 값을 false로 평가하지 않고 false 값을 변수에 할당합니다. 그것은이 것은 이상하지보다가, 조건 또는 잘못 가고 있지만, 당신은 말 그대로 나는 또한 잘못 될 수

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

에 라인을 설정하여 문제를 해결할 수있을 것입니다 나는 오전 iPad,하지만 do의 오른쪽 수준에서 "동안"입니까? 중괄호가 하나 있어야합니다.

+0

아니, 그게 옳은 수준이야, 내가 잘못 했어. –

2

루프 내에서 line 변수를 다시 읽지 않으므로 line != null은 항상 true입니다.

+0

+1, 내 눈을 미끄러 뜨 렸어. 일단 코드를 훑어 보았을 때 :-) 코드를 보지 못했다. –

2

또 다른 문제 : 카운트 값이 CardNum.length-0에서 1로 이동하기 때문에

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; 
     } 
    } 

(카운터 == CardNum.length)에서, 진실하지 않습니다. 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. 
     } 
    } 
관련 문제