Java Scanner未按预期工作

时间:2015-07-18 22:30:55

标签: java java.util.scanner

我正在尝试将文件读入我的java程序,其中txt文件中的第一行是int,后面的所有内容都是long。我遇到的问题是while循环中的每一行代码都在调用s.nextint()s.nextLong()(至少当我在Eclipse中监视它们时)。我希望它们只能在我调用它们的文本文件中递增。

首先,我做错了什么因为我的理解他们只应该在被调用时增加而不是在每行代码上增加,并且有更好的方法吗?我想如果需要的话我可以将它们全部作为单个类型加载到数组中并稍后进行转换,但这不是我认为合理的。我觉得这应该很简单,但我忽视了一些事情。

还可以说文本文件中有10个数字,然后输入1-10。我知道将一个小数字保存为int是一种浪费,但只是顺其自然。

public static long[] readfile()
{
  int row = 1;
  Scanner s = null;
  long[] nums = null;
  try {   
    s = new Scanner(new BufferedReader( new FileReader("text.txt")));   
    while (s.hasNext()) {   
      if(row == 1){
        nums = new long[s.nextInt()];
        row++;
      }
      else {
        nums[row - 2] = s.nextLong();
        row++;
      }
    }
  }
  catch (FileNotFoundException e) {   
    e.printStackTrace();   
  }    
  finally {   
    if (s != null) {   
      s.close();   
    }   
  }   
  return nums;
}

4 个答案:

答案 0 :(得分:0)

我更喜欢这样的事情:

do 
{   
  if(row == 1){
    nums = new long[s.nextInt()];
    row++;
  }
  else 
  {
    nums[row] = s.nextLong();
    row++;
  }
}while(s.hasNextLong());

我没有尝试编译或调试它;如果你需要进一步的帮助,请大声说(它假设文件顶部会有一个整数,正如你所说的那样。你应该添加代码来防范没有发生的事情。)

答案 1 :(得分:0)

您的代码正在抛出ArrayIndexOutOfBoundsException。您尝试将row用于两个目的,这会抛弃您的数组索引。当我们到达else块时,行等于2,并且您尝试将行应用于0到9(例如10个长)的数组。

您应该在检查hasNextInt()后尝试初始化数组,然后在检查long

后获取hasNextLong()个数字

代码示例(text.txt有10个数字[1234567890]):

public static void main(String[] args) throws Exception {
    long[] longs = readfile();

    if (longs != null) {
        for (long l : longs) {
            System.out.println(l);
        }
    }
}

public static long[] readfile() {
    int row = 0;
    Scanner s = null;
    long[] nums = null;
    try {
        s = new Scanner(new BufferedReader(new FileReader("text.txt")));
        if (s.hasNextInt()) {
            nums = new long[s.nextInt()];
        }
        while (s.hasNextLong()) {
            nums[row] = s.nextLong();
            row++;
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        if (s != null) {
            s.close();
        }
    }
    return nums;
}

结果:

1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890
1234567890

答案 2 :(得分:0)

我一般发现扫描程序在尝试读取多种类型时表现得很奇怪。我将为您将要阅读的每种类型创建一个单独的扫描仪。

答案 3 :(得分:0)

我说的问题似乎与日食错误有关。如果我只是在主代码中的readfile之后运行代码或设置断点,我的代码按预期工作,但是当我逐步通过eclipse时,我正在猜测。有趣的问题。我想知道究竟是什么导致了它。似乎不太可能,但不是那个编码?什么都没有像预期的那样。