0

我的代碼是這樣的:出界外的輸出,但跑了我想要它做的

public static void main(String args[]) throws IOException 
{ 
    String name; 
    int population; 
    String[] tokens; 
    FileReader fin = new FileReader("Test.txt"); 

    Scanner src = new Scanner(fin); 

    src.useDelimiter(","); 

    while (src.hasNextLine()) 
    { 
     if (src.hasNext()) 
     { 
      tokens = src.nextLine().split(",\\s"); 
      name = tokens[0]; 
      population = Integer.parseInt(tokens[1].trim()); 
      System.out.printf("Name:%-15s %-15d\n", name, population); 
     } else 
     { 
      String str = src.next(); 
      if (str.equals("")) 
      { 
       break; 
      } else 
      { 
       System.out.println("File format error."); 
       return; 
      } 
     } 
    } 
    System.out.println("end"); 
    fin.close(); 
} 

在我的測試文件,我只是有一個國家的名稱,後跟一個逗號,一個空格,人口,並可能是人口後的隨機空間。我的輸出結果

..... 名稱:弗吉尼亞7100702
名稱:華盛頓5908684
名稱:西弗吉尼亞1813077
名稱:威斯康星5371210
名稱:懷俄明495304
異常螺紋「主」 java.lang.ArrayIndexOutOfBoundsException:1 在javatesters.JavaTesters.main(JavaTesters.java:35) Java結果:1所 生成成功(總時間:0秒)

我的測試文件的結尾是

弗吉尼亞7100702
華盛頓5908684
西弗吉尼亞1813077
威斯康星5371210
懷俄明495304

共有分攤人口281424177 435

而且我希望空白行指示文件的末尾

回答

0

當您的掃描器下降到不包含「,」的行時,split(",\\s")調用將其拆分爲僅一個字符串。所以,當你訪問tokens[1]時,你會走出數組的界限。有很多方法可以解決這個問題。一種方法(雖然不是最乾淨的)會在使用之前檢查以確保tokens有兩個元素。

+0

但是不應該把while(hasNextLine())看作空白鏈接作爲文件尾部 – gooberdope 2012-03-17 22:22:00

+0

否。掃描儀的光標指向該空白行的開頭。你問「掃描儀,你有另一條線嗎?」掃描儀說:「我當然可以。」 if語句中的'hasNext()'條件也會傳遞,所以您不會將它放入其他子句中。 – 2012-03-17 22:31:21

相關問題