2014-04-02 63 views
0

我有一個文本文件admin.dat它看起來像這樣:無限循環不正常

blackranger|sdasdasdasd23123|1000 
blueranger|sdasdasdasdwhhh22|1000 
brownranger|lppsadospd123|1000 

我想讀的每一行,使用|我的分隔符和輸出到控制檯的每個部分。

代碼

package testing; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.util.Scanner; 

public class Testing { 
    public static void main(String[] args) { 
     Scanner filereader = null; 
     try { 
      filereader = new Scanner(new File("./src/testing/players.dat")); 
      String data; 
      while(filereader.hasNextLine()) { 
       String foo = "abc|123|a213"; 
       String[] bar = foo.split("|"); 
       for (int i = 0; i < 3; i++) { 
        System.out.println(bar[i]); 
       } 
      } 
     } catch (FileNotFoundException e) { 
      System.out.println("File not found"); 
     } catch (IOException e) { 
      System.out.println("Error while reading file"); 
     } finally { 
      if (filereader != null) { 
       filereader.close(); 
      } 
     } 
    } 
} 

預期的結果

blackranger 
sdasdasdasd23123 
1000 
blueranger 
sdasdasdasdwhhh22 
1000 
brownranger 
lppsadosph123 
1000 

實際結果

a // infinite loop 
b 


a 
b 


a 
b 


a 
b 



a 
b 

爲什麼我剛開g永遠打印a b的無限循環?

回答

4

你永遠不會從while循環內的FileReader讀取,因此while(filereader.hasNextLine())總是是真實的,它是有道理的循環將永遠不會結束。讓我感到驚訝的是,它看起來好像你的代碼是從循環內部的fileReader讀取的,但是將它評論出來。爲什麼?

解決方法:不要這樣做。確保在while循環內改變測試條件,否則while循環將永遠不會結束。

2
String foo = filereader.nextLine(); 
String[] bar = foo.split("\\|"); 

代替

String foo = "abc|123|a213"; 
String[] bar = foo.split("|"); 
5

你應該逃脫字符|因爲它有特殊的含義regex

foo.split("\\|"); 

但是首先,分配foo與價值,你從文件中讀取,而不是硬編碼是:

String foo = filereader.nextLine(); 
+0

你有沒有試過這段代碼,並得到了確切的答案。 – newuser

+1

不,但我是100%,該數組值的原因是,'|'應該逃脫 – Baby

+0

更新的答案後,它將正常工作。在此之前,它不會。 – newuser