输出中的超出范围异常但运行我想要它做的事情

时间:2012-03-17 21:32:08

标签: arrays exception split java.util.scanner indexoutofboundsexception

我的代码是这样的:

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
  线程“main”中的异常java.lang.ArrayIndexOutOfBoundsException:1       在javatesters.JavaTesters.main(JavaTesters.java:35)   Java结果:1   建立成功(总时间:0秒)

我的测试文件的结尾是

  

Virginia 7100702
  华盛顿5908684
  西弗吉尼亚州1813077
  威斯康星州5371210
  怀俄明州495304

     

总分配人口281424177 435

我希望空行表示文件的结尾

1 个答案:

答案 0 :(得分:0)

当您的扫描仪到达不包含“,”的行时,split(",\\s")调用会将其拆分为一个字符串。因此,当您访问tokens[1]时,您将超出数组的范围。有很多方法可以解决这个问题。一种方法(虽然不是最干净的)是检查以确保tokens在使用之前有两个元素。