Получение NoSuchElementException с использованием класса Scanner для чтения Standard.In после чтения в EOF - PullRequest
2 голосов
/ 13 декабря 2011

Итак, во-первых, это домашняя работа, хотя и не моя.Это мой зять.Он обратился ко мне за помощью, так как я занимаюсь компьютерами, но я работаю только на C ++.Он читает с клавиатуры ввод в файл, используя System.in, пока не получит EOF.После этого он создает экземпляр Scanner и вызывает на экземпляре nextLine, чтобы попытаться получить filename, и получает NoSuchElementException.По словам Javadoc, это означает, что ввод не принимается, что кажется странным, что возвращаться при использовании System.in и наборе текста на клавиатуре.Я подозреваю, что персонаж EOF почему-то не расходуется.Его код должен быть в полночь сегодня вечером, и он сделает все остальное (я посоветовал ему использовать фиктивное имя файла и вернуться к проблеме).

Вот его код:

import java.util.*;
import java.io.*;

public class FileTest
{
    public static void main(String[] args)
{
        createFile();
        readFile();
    }

public static void createFile()
{

    //Variables
    InputStream istream;
    PrintStream ostream;
    istream = System.in;
    ostream = System.out;
    Scanner keyboard = new Scanner(System.in);
    int lastEntry = 0;
    final int EOF = -1;


    //Asks user for filename.
    try
    {
        String fileName;
        System.out.println("Please enter the filename of the file you want to open: ");
        fileName = keyboard.next();

        //Creates specified file.           
        File currentFile = new File(fileName);

        //Checks if file already exists.
        while(currentFile.exists())
        { 
            System.out.println(fileName + " already exists");
            System.out.println("Error: To prevent tis file from being overwritten please enter another file name");
            fileName = keyboard.nextLine();         
        }

        //Asks user for information they want stored in file.           
        try 
        {
            ostream = new PrintStream(fileName);
            System.out.println("Please enter what you would like to put in the file and press Ctrl+Z when finished: ");

            //Writes information to file.
            try
            {
                while((lastEntry = istream.read()) != EOF)
                ostream.write(lastEntry);

            }
            catch(Exception e)
            {
                System.out.println("Error: " +e.getMessage());
            }

        }           
        catch(Exception f)
        {
            System.out.println("Error: " +e.getMessage());
        }
    }   

    finally
    {
    }

}   

public static void readFile()   
{
        InputStream input;
        PrintStream output;
        output = System.out;
        int lastEntry = 0;
        final int EOF = -1;
        Scanner keyboard2 = new Scanner(System.in);

        //Asks user for filename.
        String newFile;
        System.out.println("Please enter the filename of the file you want to open: ");

            newFile = keyboard2.next();
    }       
}

Он получает ошибку NoSuchElementException в строке newFile = keyboard2.next().Я просмотрел множество примеров и нашел людей, пишущих о данной проблеме, но я еще не нашел решения, поэтому решил, что поставлю свою (сомнительную) репутацию здесь для него.Кто-нибудь знает, как он может заставить это работать?

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

У вас здесь бесконечный цикл:

    //Checks if file already exists.
    while(currentFile.exists())
    { 
        System.out.println(fileName + " already exists");
        System.out.println("Error: To prevent tis file from being overwritten please enter another file name");
        fileName = keyboard.nextLine();         
    }

currentFile не обновляется с новым именем файла.

Что касается актуальной проблемы, то Стивен прав, как только вы нажмете EOF в методе createFile, вы не сможете получить больше ввода с клавиатуры. В этом отношении вы правы, что EOF не потребляется. Вам нужно будет использовать какой-то другой вид сигнала для обозначения конца входного текста (буквальная строка "EOF", возможно).

2 голосов
/ 13 декабря 2011

Символ EOF на консоли означает ... конец файла. Вот почему вызовы метода Scanner выбрасывают NoSuchElementException.

Нет ничего, что бы приложение на Java могло читать что-либо после маркера EOF.


Нет способа это очистить?

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

1 голос
/ 13 декабря 2011

Я читал ваш код и думаю, что нашел ошибку, совершенно не связанную с вашим вопросом:

        //Checks if file already exists.
        while(currentFile.exists())
        { 
            System.out.println(fileName + " already exists");
            System.out.println("Error: To prevent this file from being overwritten please enter another file name");
            fileName = keyboard.nextLine();         
        }

Если currentFile.exists(), вы получите бесконечный цикл, потому что вы не обновите currentFile в вашем цикле, просто fileName.

Хотя это может и не быть вашей основной задачей на данный момент, вы все равно должны это исправить, чтобы избежать проблемы в будущем.


Для решения вашей проблемы: Он может поймать исключение NoSuchElementException. В своем операторе catch он может выполнить оператор, делая то, что он хочет: выйти из метода, завершить программу, что угодно!

...