Java - Сканер: изменяется ли hasNext () соответственно после установки useDelimiter ()? - PullRequest
0 голосов
/ 22 марта 2019

Код:

    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, который я объявил ранее в исходном коде только для подсчета и увеличения в каждом цикле).

Я получал странное исключение из кода, который, я думаю, не должен выдаваться. После тестирования каждого входного файла выясняется, что мой цикл while работает, даже если в файле Latex3.bib нет «@ARTICLE».

Насколько я знаю, если файл не имеет "@ARTICLE", это означает, что input не получает никакого токена. Таким образом, с самого начала его hasNext() должно возвращать false. Но это просто не было.

Часть, которую я нахожу забавной и странной, такова: если Latex3.bib совершенно пуст (даже не один пробел или ввод), цикл while или все, что читает его как пустой файл, следовательно, * 1015 токен не присваивается. *. Однако, если Latex3.bib имеет примерно 1 ~ 3 перевода строки (входит), то цикл while выполняется. Я понятия не имею, почему это происходит. Я подозреваю, что Scanner.useDelimiter(pattern) не влияет или, по крайней мере, отлично взаимодействует с другими методами сканера, такими как hasNext(), хотя я считаю, что это не будет реальным случаем, потому что это очень важная функциональность.

редактирование: Просто чтобы понять, какое исключение я получил, StringIndexOutOfBoundsException был брошен в момент назначения author(String). Ну, это очевидно, потому что файл был пуст ... и не было ничего для substring или поиска индекса ..

...