2014-09-30 79 views
1

我有一個嵌套在do-while循環內的for循環,它將讀取文本文件並查找給定的輸入。我注意到,如果給出文件中存在的輸入,它可以很好地工作,但是有人可以幫助我理解,如果給出文本文件中不存在的輸入,程序就不會退出循環,即使它應該當文件中的文本變量變爲null時退出。我已經發布了執行for循環的所有相關代碼,包括獲得用戶輸入的部分;只是要清楚,compiling或運行該程序時沒有錯誤。爲什麼這個`do-while/for循環`永遠不會結束,如果你給一個無效的輸入?

 FileReader fileReader = new FileReader("VirtualATM.txt"); 
     BufferedReader bufferedReader = new BufferedReader(fileReader); 
     System.out.print("Enter your pin: "); 
     char [] EnterPin = {0, 0, 0 ,0}; 
     try{ 
      EnterPin = System.console().readPassword(); 
     }catch(InputMismatchException e){ 
      e.printStackTrace(); 
      System.out.println(e.getMessage()); 
      //System.out.println(e.getLocalizedMessage());   
     } 
     boolean pinTrue = false; 
     String LineFromFile = null; 
     LineFromFile = bufferedReader.readLine(); 
     String [] PinSearch = LineFromFile.split("\\s+"); 
     String UserPin = java.util.Arrays.toString(EnterPin); 
     String PinMod = UserPin.replaceAll("\\[", ""); 
     String PinMod2 = PinMod.replaceAll("\\,", ""); 
     String PinMod3 = PinMod2.replaceAll("\\s+", ""); 
     String PinToWrite = PinMod3.replaceAll("\\]", ""); 
     do{ 
      for(int search = 0; search < PinSearch.length; search++){ 
       String SearchForPin = PinSearch[search]; 
       if(SearchForPin.matches(PinToWrite)){ 
        pinTrue = true; 
        System.out.println("Success!"); 
       } 
       else if(search => PinSearch.length){ 
        System.out.println("Error! Invalid pin."); 
       } 
      } 
      LineFromFile = bufferedReader.readLine(); 
     }while(pinTrue == false && line != null); 

    }catch(IOException e){ 
     e.printStackTrace(); 
     System.out.println(e.getLocalizedMessage()); 
    } 
+0

您正在使用哪個版本的java? Was =>意思是> =? – 2014-09-30 14:06:21

回答

1

您需要移動專業版在你閱讀的每一行之後都要留意循環內部。否則,您只處理循環前讀取的第一行。

do{ 
     for(int search = 0; search < PinSearch.length; search++){ 
      String SearchForPin = PinSearch[search]; 
      if(SearchForPin.matches(PinToWrite)){ 
       pinTrue = true; 
       System.out.println("Success!"); 
      } 
      else if(search => PinSearch.length){ 
       System.out.println("Error! Invalid pin."); 
      } 
     } 
     LineFromFile = bufferedReader.readLine(); 
     if (LineFromFile != null) { 
      PinSearch = LineFromFile.split("\\s+"); 
      UserPin = java.util.Arrays.toString(EnterPin); 
      PinMod = UserPin.replaceAll("\\[", ""); 
      PinMod2 = PinMod.replaceAll("\\,", ""); 
      PinMod3 = PinMod2.replaceAll("\\s+", ""); 
      PinToWrite = PinMod3.replaceAll("\\]", ""); 
     } 
    } while(pinTrue == false && LineFromFile != null); 
+0

添加'PinSearch = LineFromFile.split(「\\ s +」);'在循環中給我一個空指針異常 – James 2014-09-30 14:06:09

+0

@James我修復了我的答案。 – Eran 2014-09-30 14:07:45

+0

這很好,工作,謝謝! – James 2014-09-30 14:12:01

1

因爲你正在測試line,但讀入LineFromFile

更改此

}while(pinTrue == false && line != null); 

喜歡的東西

}while(!pinTrue && LineFromFile != null); 

而且,作爲Eran筆記here,你行處理邏輯應該在do的身體,讓

do{ 
    String LineFromFile = bufferedReader.readLine(); 
    String [] PinSearch = LineFromFile.split("\\s+"); 
    String UserPin = java.util.Arrays.toString(EnterPin); 
    String PinMod = UserPin.replaceAll("\\[", ""); 
    String PinMod2 = PinMod.replaceAll("\\,", ""); 
    String PinMod3 = PinMod2.replaceAll("\\s+", ""); 
    String PinToWrite = PinMod3.replaceAll("\\]", ""); 
+0

這不是唯一的問題。 – Eran 2014-09-30 14:01:23

+0

@Eran謝謝!編輯。 – 2014-09-30 14:06:57

+0

它是在循環之前定義的(我不是故意刪除循環外的任何代碼)。我想你可以把這個邏輯放在循環的開始,而不是在兩個地方。 – Eran 2014-09-30 14:09:54

相關問題