当前位置: 代码迷 >> java >> Java扫描仪无法正常工作
  详细解决方案

Java扫描仪无法正常工作

热度:90   发布时间:2023-08-02 10:29:59.0

我正在尝试将文件读取到我的Java程序中,其中txt文件的第一行是int,之后的所有内容都很长。 我遇到的问题是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;
}

我更喜欢这样的东西:

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

我没有尝试对其进行编译或调试。 您需要进一步的帮助。 (它假定文件顶上将有一个整数,就像您所说的那样。您可能应该添加代码以防止这种情况发生。)

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

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

代码示例(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

我通常发现,尝试读取多种类型时,扫描仪的行为异常。 我将为您要阅读的每种类型创建一个单独的扫描仪。

看来我所说的问题与月食错误有关。 如果我只是运行代码或在主文件中的readfile之后设置断点,我的代码将按预期工作,但是当我逐步执行值时,Eclipse并没有正确分配值。 有趣的问题。 我想确切地了解是什么原因造成的。 似乎不太可能,但那不是编码吗? 没有任何进展。

  相关解决方案