Java-扫描仪:设置useDelimiter()后hasNext()是否会相应更改?

时间:2019-03-22 10:04:19

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

代码:

    Scanner input;
    File file = new File("Latex3.bib");
    input = new Scanner(file);
    input.useDelimiter("@ARTICLE");
    while(input.hasNext()) {
        System.out.println("It should not print this");
        s = input.next();
        System.out.println("Token"+c+": "+s);
        c++;
        author = s.substring
                (s.indexOf("author={")+8, 
                        s.indexOf("}", s.indexOf("author={")+8));
        System.out.println("Authors for this ARTICLE: "+author);
        System.out.println();
    }

(在代码中,c是我先前在原始代码中声明的int,仅用于每个循环的计数和递增)。

我从我认为不应抛出的代码中得到了奇怪的异常。测试每个输入文件后,即使Latex3.bib文件中没有“ @ARTICLE”,我的while循环也会运行。

据我所知,如果文件没有“ @ARTICLE”,则意味着input不会获得任何令牌。因此,从一开始,其hasNext()应该返回false。但这不是。

我觉得有趣和奇怪的部分是:如果Latex3.bib完全为空(甚至没有一个空格键或Enter),while循环或任何将其读取为空文件的东西,因此没有给{{ 1}}。 但是,如果Latex3.bib具有1〜3个换行符(输入),则运行while循环。我不知道为什么会这样。我怀疑input不会影响或至少与Scanner.useDelimiter(pattern)之类的其他Scanner方法完美配合,尽管我认为这不是真实情况,因为它是非常关键的功能。

编辑: 为了清楚我得到什么异常,在分配hasNext()时抛出了StringIndexOutOfBoundsException。显然,因为文件为空...而且author(String)或查找索引中没有任何内容。

0 个答案:

没有答案