Java NoSuchElementException: строка не найдена - PullRequest
0 голосов
/ 14 октября 2018

edit: добавление одного из методов, вызываемых ниже, на случай, если проблема связана с методом, а не с циклом.

Ниже приведено меню переключателя, в нем есть несколько случаев.Каждый случай вызывает открытый метод void из другого класса и успешно завершается; предполагается, что он отображает метод меню (метод, который печатает параметры меню) и позволяет пользователю выбрать другой параметр.В настоящее время, после завершения одного случая, программа showMenu () снова, затем мгновенно прерывается:

String menu = in.nextLine();

на второй итерации меню и отправляет обратно

java.util.NoSuchElementException: No line found

Вопрос: Iнужна программа для паузы или что-то похожее после showMenu ();чтобы позволить пользователю ввести выбор меню, в настоящее время меню отображается, и программа мгновенно завершает работу

Приветствия

public class Menu {
    public static char selection;
    public static String quitting = "you dun son";
    public static String errorMessage = "THAAAAATSS A menu WRRRAAAAAPPP";

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    try {
        do {
            showMenu();
            String menu = in.nextLine();
            if (menu.length() > 0) {
                selection = menu.toLowerCase().charAt(0); // extract the first char of the line read
            } else {
                selection = '\0';
                System.out.println("invalid input:\t" + selection);
                System.out.println("Press enter to continue...");
            }
            switch (selection) {
                case 'f':
                    FuelConsole fuelObject = new FuelConsole();
                    fuelObject.fuelCalc();
                    break;
                case 'g':
                    GameConsole gameObject = new GameConsole();
                    gameObject.gameCalc();
                    break;
                case 'q':
                    System.out.println("\nEnding Now\n");
                    System.exit(0);
                    break;
                default:
                    System.out.println("Instruction is invalid");
                }
        } while (selection != 'Q' && selection != 'q');
        {
            System.out.println(quitting);
            System.exit(0);
        }
    }catch (Exception e) {
        System.out.println(errorMessage);
    }
}

метод тестирования:

public class FuelConsole {

    public static String errorMessage = "THAAAAATSS A fuel calc WRRRRAAAAAPPPPPPPPPPPP";
    public static Double acceptableCentsPerLitre = 16.00;
    Scanner scan = new Scanner(System.in);

    public void fuelCalc() {

    try {
        System.out.println("\nyou selected option 'f' --- here you will enter some information and find average fuel for ONE trip. ");
        System.out.println("please enter the amount of fuel in litres:\n ");
        float fuel = scan.nextFloat();

        System.out.println("please enter the price of fuel in cents (not dollars and cents, only CENTS (lulz)):\n ");
        int cent = scan.nextInt();

        System.out.println("please enter the number of kilometers travelled on the tank:\n ");
        float kilo = scan.nextFloat();

        float returnAFC = afc(fuel, kilo);
        float returnAC = ac(returnAFC, cent);

        System.out.println("average consumption: \t" + returnAFC);
        System.out.println("average cost: \t\t" + returnAC);
        if (returnAC > acceptableCentsPerLitre) {
            System.out.println("Average fuel is above 16c per litre");
        } else {
            System.out.println("Average fuel is below 16c per litre");
        }

    } catch (Exception e) {
        System.out.println(errorMessage);
        e.printStackTrace();

    } finally {
        scan.close();
    }

}

public static float afc(float x, float z) {
    float result = x / z;
    return result;
}

public static float ac(float x, int y) {
    float result = x * y;
    return result;
}

}

1 Ответ

0 голосов
/ 14 октября 2018

Мне кажется, проблема в том, что вы создаете новый сканер в классе FuelConsole.И вы также закрываете его в блоке finally.

Но когда вы вызываете close () на сканере, он также закрывает нижележащий InputStream.(System.in в данном случае) И поскольку ваш сканер верхнего уровня использует тот же InputStream, он не может больше получать от него входные данные.

Решение может быть, если вы передадите сканер верхнего уровня в качестве аргументадругие объекты:

            case 'f':
                FuelConsole fuelObject = new FuelConsole();
                fuelObject.fuelCalc(in);
                break;
            case 'g':
                GameConsole gameObject = new GameConsole();
                gameObject.gameCalc(in);
                break;

и

public void fuelCalc(Scanner scan) {

try {

...

и удаление блока finally

...