Продолжайте получать java.util.NoSuchElementException в этой программе

В настоящее время я пишу программу, которая записывает коды классов в файл, а затем считывает их обратно из указанного файла и печатает их на экране. Каждый раз, когда я запускаю программу, я продолжаю получать java.util.NoSuchElementException. Эта проблема сохраняется после каждой модификации, которую я сделал, и я не уверен, куда идти отсюда. Любая помощь будет принята с благодарностью.

package u2a1_readtextfilehandleexcep;
import java.io.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner;

public class U2A1_ReadTextFileHandleExcep {

public static void main(String[] args) throws FileNotFoundException, IOException {
    //Create new file called course.txt
    java.io.File file = new java.io.File("course.txt");
    if (file.exists()) {
        System.out.println("File already exists; try another name.");
        System.exit(0);
    }
    //Input the specified words to the file
    try (PrintWriter output = new PrintWriter(file)) {
        output.println("IT2249 6 Introduction to Programming with Java");
        output.println("IT2230 3 Introduction to Database Systems");
        output.println("IT4789 3 Mobile Cloud Computing Application Development");
    }
    try (
            //Reads from file to the console
            Scanner input = new Scanner(file)) {
            while (file.canRead()) {
            String code = input.next();
            int creditHours = input.nextInt();
            String courseTitle = input.nextLine();
            System.out.println("Course Code = " + code + " | Credit Hours = " + creditHours + " | Course Title = " + courseTitle);
        }
         input.close();   
    }
}

}

И после запуска программы:

Course Code = IT2249 | Credit Hours = 6 | Course Title =  Introduction to Programming with Java
Exception in thread "main" java.util.NoSuchElementException
Course Code = IT2230 | Credit Hours = 3 | Course Title =  Introduction to Database Systems
Course Code = IT4789 | Credit Hours = 3 | Course Title =  Mobile Cloud Computing Application Development
at java.util.Scanner.throwFor(Scanner.java:862)
at java.util.Scanner.next(Scanner.java:1371)
at u2a1_readtextfilehandleexcep.U2A1_ReadTextFileHandleExcep.main(U2A1_ReadTextFileHandleExcep.java:26)
C:UsersDebAppDataLocalNetBeansCache8.2executor-snippets
un.xml:53: Java returned: 1
BUILD FAILED (total time: 1 second)

java,

0

Ответов: 3


1

После того, как осталось больше элементов для чтения, вы Scannerполучите исключение, которое вы видите. Прямо сейчас вы продолжаете цикл, пока можете прочитать файл, но это не влияет на то, где Scannerнаходится файл. Scannerпредоставляет семейство функций , чтобы проверить правильность следующих лексем: hasNext(), hasNextInt(), hasNextLine()и т.д. Вы должны использовать их вместо того, чтобы :

while( input.hasNext() ) {
    String code = input.next();
    // ...
}

Однако, если у вас есть искаженный файл, вы по-прежнему можете получить исключение по аналогичным причинам, считая часы и титры. Вы можете обработать их, проверив сканер перед их чтением или, возможно, в обработчике исключений, поскольку это, вероятно, указывает на большую проблему, например, чтение неподдерживаемого или поврежденного файла.


0
  • Пожалуйста, позвоните Scanner.hasNext(), чтобы цикл завершился, когда элементов больше нет.

  • Не закрывайте ввод явно, поскольку вы используете try-with-resources, который позаботится об этом.

  • Нет необходимости в двух отдельных блоках try, поскольку они могут быть объединены вместе, как только запись закончена, используйте, PrintWriter.flush()чтобы записать ее на диск.

    package u2a1_readtextfilehandleexcep;
    import java.io.*;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.util.Scanner;
    
    public class U2A1_ReadTextFileHandleExcep {
    
    public static void main(String[] args) throws FileNotFoundException, IOException {
        //Create new file called course.txt
        java.io.File file = new java.io.File("course.txt");
        if (file.exists()) {
            System.out.println("File already exists; try another name.");
            System.exit(0);
        }
        //Input the specified words to the file
        try (PrintWriter output = new PrintWriter(file);Scanner input = new Scanner(file)) {
            output.println("IT2249 6 Introduction to Programming with Java");
            output.println("IT2230 3 Introduction to Database Systems");
            output.println("IT4789 3 Mobile Cloud Computing Application Development");
            output.flush();
            while (file.canRead()  && input.hasNext()) {
                String code = input.next();
                int creditHours = input.nextInt();
                String courseTitle = input.nextLine();
                System.out.println("Course Code = " + code + " | Credit Hours = " + creditHours + " | Course Title = " + courseTitle);
            }
    
        }
      }
    }

0

file.canRead()всегда будет возвращать true, и когда указатель чтения достигнет EOF, следующая input.read()операция завершится с ошибкой.

Используйте, input.hasNextLine()чтобы проверить, достигнут ли EOF.

Ява,
Похожие вопросы