【问题标题】:NoSuchElementException: No line found -- Scanner JavaNoSuchElementException:未找到行 - 扫描程序 Java
【发布时间】:2013-12-10 20:40:14
【问题描述】:

我正在尝试编写一个在给定文件路径和名称的情况下读取文件的方法。我之前在我的程序中调用过这个方法一次,它运行良好。但是,在我第二次打电话时,它给了我一个错误,上面写着 NoSuchElementException: No line found。我查看了许多其他线程,发现问题在于关闭 Scanner 也会关闭 System.in。但是,我不会关闭任何扫描仪或任何输入/输出流。该方法如下所示:

public static Map readFileMap(String path, String fileName)
    throws IOException
  {
    path = path.replace("/", "\\");
    String key = null;
    String val = null;
    Map<String, String> map = new HashMap<String,String>();
    input = new Scanner(new File(path + fileName));
    int numLines = Helper.numLines(path + fileName);
    System.out.println(numLines);
    for (int loop = 0; loop < numLines; loop++)
    //while(input.hasNextLine())
    {
      String all = input.nextLine();
      System.out.println(all);
      String[] pieces = all.split("\\s", 2);
      key = pieces[0];
      val = pieces[1];
      map.put(key, val);
    }
    return map;
  }

变量 numLines 包含(正确的)值 143。如果它与文件的数据有关,则数据如下所示:

! %21
" %22
# %23
$ %24
% %25
& %26
' %27
( %28
) %29
* %2A
+ %2B
, %2C
- %2D
. %2E
/ %2F
[ %5B
\ %5C
] %5D
^ %5E
_ %5F
` %60
~ %7E
  %7F
` %80
‚ %82
ƒ %83
„ %84
… %85
† %86
‡ %87
ˆ %88
‰ %89
Š %8A
‹ %8B
Œ %8C
Ž %8E
‘ %91
’ %92
“ %93
” %94
• %95
– %96
— %97
˜ %98
™ %99
š %9A
› %9B
œ %9C
ž %9E
Ÿ %9F
¡ %A1
¢ %A2
£ %A3
¤ %A4
¥ %A5
¦ %A6
§ %A7
¨ %A8
© %A9
ª %AA
« %AB
¬ %AC
® %AE
¯ %AF
° %B0
± %B1
² %B2
³ %B3
´ %B4
µ %B5
¶ %B6
· %B7
¸ %B8
¹ %B9
º %BA
» %BB
¼ %BC
½ %BD
¾ %BE
¿ %BF
À %C0
Á %C1
 %C2
à %C3
Ä %C4
Å %C5
Æ %C6
Ç %C7
È %C8
É %C9
Ê %CA
Ë %CB
Ì %CC
Í %CD
Î %CE
Ï %CF
Ð %D0
Ñ %D1
Ò %D2
Ó %D3
Ô %D4
Õ %D5
Ö %D6
× %D7
Ø %D8
Ù %D9
Ú %DA
Û %DB
Ü %DC
Ý %DD
Þ %DE
ß %DF
à %E0
á %E1
â %E2
ã %E3
ä %E4
å %E5
æ %E6
ç %E7
è %E8
é %E9
ê %EA
ë %EB
ì %EC
í %ED
î %EE
ï %EF
ð %F0
ñ %F1
ò %F2
ó %F3
ô %F4
õ %F5
ö %F6
÷ %F7
ø %F8
ù %F9
ú %FA
û %FB
ü %FC
ý %FD
þ %FE
ÿ %FF

正如我之前提到的,当我第一次调用该方法时,一切运行正常。所以我的猜测是它与我重新初始化变量input有关。任何帮助将不胜感激!

【问题讨论】:

  • input.hasNextLine() 有什么问题?你为什么不使用它?
  • 您发布的数据包含144行。
  • @Mac input.hasNextLine() 没有执行,因为由于某种原因它返回 false,即使 numLines 告诉我它不为空。当我尝试使用 input.hasNextLine() 时,异常也不会打印,所以我不知道发生了什么。
  • @BheshGurung 我不确定为什么 numLines 会给我 143。计数功能适用于我以前的文件,所以我不太确定这是怎么回事。但我真的不需要 numLines。我只是为了确保程序能够看到文件中有数据。

标签: java file file-io java.util.scanner nosuchelementexception


【解决方案1】:

由于您正在阅读的文件的性质,您还应该将字符编码指定为Scanner。例如,如果文件以 UTF-8 保存,则应使用构造函数 new Scanner(myFile, "UTF-8")。通过此更改尝试您的代码,我可以毫无问题地读取您发布的文件(我已将此文件保存为 UTF-8,您可能将其保存为其他编码)。此外,input.hasNextLine() 调用在此更改后按预期工作。

编辑:您可以尝试使用 Scanner 以外的其他内容,例如,如果您有 Java 7,您可以这样做:

path = path.replace("/", "\\");
Map<String, String> map = new HashMap<String, String>();

for (String line : Files.readAllLines(Paths.get(path + fileName), Charset.defaultCharset())) {
  String[] pieces = line.split("\\s", 2);
  map.put(pieces[0], pieces[1]);
}

return map;

如果发现不可读的字符集,这应该抛出异常。如果您没有 Java 7,那么您可以尝试以下类似的方法。我发现如果编码错误,这个方法不会抛出任何异常,而只是打印出很多“?”对于它无法读取的字符。

path = path.replace("/", "\\");
Map<String, String> map = new HashMap<String, String>();
BufferedReader reader = new BufferedReader(new InputStreamReader(
    new FileInputStream(path + fileName)));

while (true) {
  String line = reader.readLine();
  if (line == null) {
    break;
  }
  String[] pieces = line.split("\\s", 2);
  map.put(pieces[0], pieces[1]);
}

reader.close();
return map;

这个

【讨论】:

  • 我尝试将它添加到扫描仪中,但我得到了同样的错误。我认为这与重新初始化有关,因为对函数的第一次调用按预期工作;但我不确定。
  • 第一次调用函数读取的是完全相同的文件吗?
  • 不,它正在读取不同的文件,但它具有相同的布局并以相同的字符集编码。
  • 我编辑添加了一些额外的方法,您可以尝试读取文件。这两种方法都应该比Scanner 为您提供更多有关失败的信息。
  • 我也尝试了这两种方法,但没有出现任何错误。但是,方法调用失败,地图仍然是空的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多