Как исправить выбрасываемое исключение NoSuchElementException

Я создал интерактивный класс, решающий задачи кинематического уравнения (доступ к которому осуществляется в другом классе в цикле пользовательского ввода: mathiverse), который отлично работает, но после получения ответа выдает ошибку NoSuchElementException.

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

Мой пользовательский цикл ввода и кинематический конструктор (не в одном классе):

while(!(input.equals("exit")))
{
    if(input.equals("help"))
    {
        System.out.println("~ Commands ~");
        System.out.println("help - brings up a list of 
        commands(what you're reading)");
        System.out.println("kinematic - solves a kinematic 
        equations problem; requires input of known and unknown 
        variables");
        System.out.println("exit - closes the program");
        System.out.println("~~~~~~~~~~~~");
    }

    //user decides to explore kinematic options
    if(input.equals("kinematic"))
    {
        Kinematic calc = new Kinematic();

        System.out.println(calc.answer());
    }

    input = scan.nextLine();
}

public Kinematic()
{
    Scanner scanMath = new Scanner(System.in);

    System.out.println("If you are solving for the variable, enter \"?\", 
    if the variable is not given, enter a space.");
    System.out.println("Enter the acceleration: ");
    acc = scanMath.nextLine();

    System.out.println("Enter the displacement: ");
    disp = scanMath.nextLine();

    System.out.println("Enter the initial velocity: ");
    init = scanMath.nextLine();

    System.out.println("Enter the final velocity: ");
    fin = scanMath.nextLine();

    System.out.println("Enter the time: ");
    time = scanMath.nextLine();

    scanMath.close();
}

После того, как ответ будет дан, я хотел бы, чтобы мой код продолжил поиск ввода, но он выдает это сообщение:

Исключение в потоке "main" java.util.NoSuchElementException: строка не найдена в java.base/java.util.Scanner.nextLine(Scanner.java:1651) в Mathiverse.main(Mathiverse.java:53)


person TheDankMeister    schedule 28.09.2019    source источник


Ответы (1)


При закрытии сканера из Kinematic вы также закрываете поток System.in. Используйте один и тот же сканер как в основном методе, так и в кинематике.

Взгляните на: java.util.NoSuchElementException - сканер, читающий пользовательский ввод

person Martin'sRun    schedule 28.09.2019