我遇到了一个我真的不明白的问题。 我设计了我的程序来从文件中读取信息,然后生成有关它的报告。
第一次,我打开了我需要的所有文件:
clientesarq = new File(args[1]);
fornecedoresarq = new File(args[3]);
produtosarq = new File(args[5]);
然后我使用java.util.Scanner来遍历它们:
leitor = new Scanner(clientesarq);
leitor.nextLine();
/* leitura e armazenamento dos clientes em mapa */
while(leitor.hasNextLine()) {
Cliente c = pd.novoCliente(leitor);
clientes.addCliente(c);
}
leitor = new Scanner(fornecedoresarq);
leitor.nextLine();
/* leitura e arazenaento dos fornecedores em mapa */
while(leitor.hasNextLine()) {
Fornecedor f = pd.novoFornecedor(leitor);
fornecedores.addFornecedor(f);
}
当我的程序到达代码的这一部分时,JVM会向我抛出NoSuchElementException。
leitor = new Scanner(produtosarq);
leitor.nextLine(); /* EXCEPTION HERE */
/* leitura e armazenamento dos produtos em mapa */
while(leitor.hasNextLine()) {
Produto p = pd.novoProduto(leitor);
produtos.addProduto(p);
}
我真的想知道为什么我会得到这种情况,正如你所看到的,代码与其他代码完全一样。任何?
您可以在此处获取所有需要的文件:https://www.dropbox.com/sh/c48roudfwuj7qzu/AAAMn_OFGXJFHEjVJyZ7piCPa
答案 0 :(得分:1)
使用UTF-8
字符集从文件中读取,该文件能够代表Unicode格式的每个字符。
在这里,它会使用指定的字符集(此处为UTF-8 )将文件中的字节转换为字符,并使Scanner
的字符可读。我猜。
Scanner input = new Scanner(new File("filename"),"UTF-8");
答案 1 :(得分:1)
指定charset并没有为我解决问题。这篇文章是评论性的,因为我还没有完全发现这个问题,但我试图用迄今为止我发现的问题来解释问题的为什么部分。
我发现another post与辅助资源存在同样的问题。在这两种情况下,文件的第一行以ASCII字符13 carriage return
结尾,我认为扫描器应该将其作为行分隔符。作为一个完整性检查,我执行了BufferedReader readLine(),它工作正常。深入挖掘,我克隆了扫描仪的来源并在readInput第849行n = source.read(buf);
上结束。
在确定source
sun.nio.cs.StreamDecoder
的类型后,我克隆了课程并调查了readImpl。在这两种情况下,第324行int n = readBytes();
将整个文件读入缓冲区,然后点击continue
并返回第316行CoderResult cr = decoder.decode(bb, cb, eof);
此时cr
正在包裹catch (IOException ioe)
3}}被扫描器java.nio.charset.MalformedInputException: Input length = 1
at java.nio.charset.CoderResult.throwException(CoderResult.java:281)
at javaapplication1.StreamDecoder.implRead(StreamDecoder.java:349)
at javaapplication1.StreamDecoder.read(StreamDecoder.java:188)
at java.io.Reader.read(Reader.java:100)
at javaapplication1.MyScanner.readInput(MyScanner.java:844)
at javaapplication1.MyScanner.findWithinHorizon(MyScanner.java:1789)
at javaapplication1.MyScanner.nextLine(MyScanner.java:1629)
占用。
由于我能够在克隆源中重现此问题,因此我打印了stacktrace:
{{1}}
运行时解码器为MalformedInputException。我已经停止了挖掘这一点,因为它已进入上午时段,我可以编辑进一步的调查结果。
现在的主要问题是为什么输入的最后一个字符会杀死解码器。
答案 2 :(得分:0)
只是一个猜测,但也许您正在尝试阅读的文件没有任何信息。在获得下一行之前,请务必检查它是否有下一行。
if(scanner.hasNextLine()){
String line = scanner.nextLine();
}