Код:
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
или поиска индекса ..