使用Scanner时,jvm抛出NoSuchElementException

时间:2014-06-28 02:55:41

标签: java

我遇到了一个我真的不明白的问题。 我设计了我的程序来从文件中读取信息,然后生成有关它的报告。

第一次,我打开了我需要的所有文件:

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

3 个答案:

答案 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();
}