java.util.NoSuchElementException: строка не найдена — проблемы со сканером / PriintWriter

#java

#java

Вопрос:

Я хочу создать несколько пакетных сценариев, используя csv и txt-файл, и при запуске я получаю сообщение об ошибке. Я прокомментировал код, чтобы вы могли определить мои намерения из этих заметок. Я пишу здесь больше только потому, что бот требует, чтобы я продолжал писать больше объяснений, прежде чем я смогу опубликовать. Как только это красное текстовое поле исчезнет, я перестану писать, и вы сможете прекратить чтение. Я действительно надеюсь, что вы уже перестали читать, потому что это либо утомило бы меня, это точно. Я начинаю задаваться вопросом, может быть, мне следует начать новый абзац. Давайте посмотрим, поможет ли это.

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

Исключение в потоке «main» java.util.NoSuchElementException: строка не найдена в java.util.Scanner.nextLine(Scanner.java: 1540) в printerscriptcreator.PrinterScriptCreator.main(PrinterScriptCreator.java:29)

 public class PrinterScriptCreator {  
    public static void main(String[] args) throws FileNotFoundException {
        File csvFile = new File("printers.csv");
        File txtFile = new File("xeroxTemplate.txt");
        Scanner csvScanner = new Scanner(csvFile);
        csvScanner.useDelimiter(",");
        Scanner txtScanner = new Scanner(txtFile);

        try{
            while(csvScanner.hasNext()){
                //create file with name from first csv cell
                File file = new File(csvScanner.next());
                //create FileWriter to populate the newly created file
                FileWriter fw = new FileWriter(file);
                //create PrintWriter to communicate with FileWriter
                PrintWriter pw = new PrintWriter(fw);
                //copy first 7 lines from xeroxTemplate.txt
                for(int i=0; i<7; i  ){
                    pw.println(txtScanner.nextLine());
                }
                //copy the next three cells from CSV into new file
                for(int i=0; i<3; i  ){
                    pw.println(csvScanner.next());
                }
                //copy remaining lines from TXT to the new file
                while(txtScanner.hasNextLine()){
                    pw.println(txtScanner.nextLine());
                }
            }  
        } catch (IOException ex) {
            System.out.printf("ERROR: %sn", ex);
        }    
    }    
}
  

Комментарии:

1. Java отлично подходит для этого, нет необходимости использовать другой язык.

Ответ №1:

Я заметил, что вы проверяете hasNext() один раз, а затем захватываете next() три раза. Вероятно, вам следует поставить условие hasNext() внутри цикла for.

 while(csvScanner.hasNext()){

    ...

        //copy the next three cells from CSV into new file
        for(int i=0; i<3; i  ){
            pw.println(csvScanner.next());
        }
  

Ответ №2:

 Exception in thread "main" java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Scanner.java:1540)
at printerscriptcreator.PrinterScriptCreator.main(PrinterScriptCreator.java:29)
  

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

Он сообщает вам PrinterScriptCreator.java:29. У меня нет номеров строк для вашей вставки, но проверьте строку 29. Что это за строка? Я предполагаю, что это так:

 for(int i=0; i<7; i  ){
        pw.println(txtScanner.nextLine());
}
  

вы пытаетесь извлечь 7 строк, а их нет 7. Поэтому он выдает исключение.

Вы можете попробовать сделать что-то вроде

 for(int i=0; i<7; i  ){
    if(txtScanner.hasNextLine()){
            pw.println(txtScanner.nextLine());
    }
}
  

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

Комментарии:

1. Необходимо создать txtScanner в цикле while, чтобы он воссоздавался после каждого создания файла. В противном случае у него закончились строки.

Ответ №3:

Необходимо создать txtScanner в цикле while, чтобы он воссоздавался после каждого создания файла. В противном случае у него закончились строки.

Комментарии:

1. Это совсем не похоже на правильное решение. Вам не нужно этого делать. Воссоздание его также читает одни и те же строки снова и снова, верно? Как выглядят ваши входные данные?