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

相关问题