while (myFile.hasNextLine()) { if(myFile.next().equals("Oval")) { System.out.println("this is an Oval"); } else if(myFile.next().equals("Rectangle")) { System.out.println("this is an Rectangle"); }
файл содержит следующее
Овал 10 10 80 90 Красный
Овал 20 20 50 60 Синий
Прямоугольник 10 10 100 100 Зеленый
Я хочу извлечь данные и передать их конкретному конструктору в соответствии с типом, указанным в начале строки.
но я получаю этот странный результат
это Oval Exception в потоке "main" java.util.NoSuchElementException это прямоугольник в java.util.Scanner.throwFor(Scanner.java:907), это прямоугольник в java.util.Scanner.next(Scanner.java: 1416) в TestMain.main(TestMain.java:33) на sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) на sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) на sun.reflect.DelegatingMethodAccessorImpl.invoke( DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke(Method.java:601) в com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
Процесс завершен с кодом выхода 1
Поймите, что когда вы вызываете next()
на объект Scanner, он ест следующий токен, а затем возвращает его вам. Если вы не назначаете String, возвращаемую переменной, она теряется навсегда, и при следующем вызове next()
вы получаете новый токен. Намного лучше получить токен, назначить его переменной String, а затем выполнить ваши тесты if. Не вызывайте next()
в булевом тестовом блоке if.
т.е. что-то вроде:
while (myFile.hasNextLine()) {
// get the token **once** and assign it to a local variable
String text = myFile.nextLine();
// now use the local variable to your heart content
if(text.equals("Oval")) {
System.out.println("this is an Oval");
}
else if(text.equals("Rectangle")) {
System.out.println("this is an Rectangle");
}
Кроме того, если вы проверяете hasNextLine()
тогда вы должны вызвать nextLine()
, а не next()
, и вы должны вызывать его только один раз для каждого hasNextLine.
При извлечении строк из текстового файла я иногда использую более одного сканера. Например:
Scanner fileScanner = new Scanner(myFile);
while (fileScanner.hasNextLine()) {
Scanner lineScanner = new Scanner(fileScanner.nextLine());
// use the lineScanner to extract tokens from the line
lineScanner.close();
}
fileScanner.close(); // likely done in a finally block after null check
Вам нужно сопоставить свой next()
с hasNext()
метода hasNext()
для соответствия отдельному токену String
while (myFile.hasNext()) {
String token = myFile.next();
if (token.equals("Oval")) {
System.out.println("this is an Oval");
}
...
}
next()
и послеnextLine()
чтобы выбросить строку, так как OP проверяет только «Oval» и «Rectangle», либо разбейте String и выполните первую часть.NoSuchElementException
?, не должно быть хорошо, чтобы использоватьhasNextLine()
чтобыhasNextLine()
файл?