Оператор переключения в цикле for

У меня проблема, когда после того, как я выберу один из четырех вариантов со своим сканером, он по умолчанию будет использовать этот случай переключателя, так что, скажем, я сначала нажимаю 1, ввожу свою строку слов, затем нажимаю 2, он все равно будет выполняться, как если бы Я попал в случай 1. Что я здесь сделал не так?

  public static void menu()
{
    FileClass f = new FileClass();

    Scanner scan = new Scanner(System.in);
    System.out.println("Choose an option");
    System.out.println("1: Write To File\n2: Read From File\n3: Delete From File\n4: Exit Program");
    int choice = scan.nextInt();

    while(choice < 5) {
        switch(choice) {

            case 1:
            System.out.println("Enter a line you wish to write to the file: ");
            Scanner inputW = new Scanner(System.in);
            String lineWrite = inputW.nextLine();
            f.writeToFile(lineWrite);
            break;

            case 2:
            System.out.println("This is Everything on the File:");
            f.readFromFile();
            break;

            case 3:
            System.out.println("Enter a line you wish to delete from the file: ");
            Scanner inputD = new Scanner(System.in);
            String lineDelete = inputD.nextLine();
            f.deleteFromFile(lineDelete);
            break;

            case 4:
            System.exit(0);
            break;

        }
        System.out.println("Choose an option");
        System.out.println("1: Write To File\n2: Read From File\n3: Delete From File\nExit Program");
        scan.nextInt();
    }
    System.exit(0);
}

Последний scan.nextInt(); - вы не назначаете его переменной choice

user7 09.06.2018 06:57

Вы помещаете строку, которая читает ввод пользователя вне вашего цикла

Mad Physicist 09.06.2018 06:58

вам не нужен новый сканер для каждого случая; просто продолжайте использовать оригинальный сканер

Charlie 09.06.2018 06:58

Вы нигде не обновляете свою переменную выбора.

Sarhad Salam 09.06.2018 06:59

Переместите int choice = scan.nextInt(); в цикл, удалите неназначенное чтение в конце.

Mad Physicist 09.06.2018 06:59

Также - когда вы используете nextInt (), вы не используете символ новой строки после числа. См. stackoverflow.com/q/13102045

Dawood ibn Kareem 09.06.2018 07:00

@MadPhysicist, если я это сделаю, программа не может найти символ 'выбор', потому что он инициализируется после цикла while

Layken 09.06.2018 07:12

Хорошая точка зрения. Сделайте это делом времени.

Mad Physicist 09.06.2018 08:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
8
112
2

Ответы 2

Я думаю, что ваше последнее использование scan.nextInt() излишне. Думаю, ваша программа могла бы выглядеть так:

public static void main(String... args) {
    try (Scanner scan = new Scanner(System.in)) {
        int choice = 0;

        while (choice < 4) {
            System.out.println("Choose an option");
            System.out.println("1: Write To File");
            System.out.println("2: Read From File");
            System.out.println("3: Delete From File");
            System.out.println("4: Exit Program");

            choice = scan.nextInt();

            switch (choice) {
                case 1:
                    System.out.println("Enter a line you wish to write to the file: ");
                    break;
                case 2:
                    System.out.println("This is Everything on the File:");
                    break;
                case 3:
                    System.out.println("Enter a line you wish to delete from the file: ");
                    break;
            }
        }
    }
}

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

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

Scanner для конкретного пара нужно создать только один раз и использовать повторно. На System.in нет необходимости в нескольких сканерах.

Технически вы обрабатываете вводы> = 4 как команды выхода. Нет необходимости в отдельной записи switch, по крайней мере, в вашем опубликованном коде.

Каждый раз, когда пользователь нажимает клавишу ввода, вы получаете новую строку во вводе. Новая строка помешает вам правильно разобрать вещи, поэтому вам нужно избавиться от нее. Хороший способ - вызвать Scanner.nextLine между вызовами nextInt:

public static void menu()
{
    FileClass f = new FileClass();

    Scanner scan = new Scanner(System.in);
    int choice = 0;
    while(choice < 4) {
        System.out.println("Choose an option");
        System.out.println("1: Write To File\n2: Read From File\n3: Delete From File\n4: Exit Program");
        choice = scan.nextInt();
        scan.nextLine(); // Get rid of the trailing newline character

        switch(choice) {
            case 1:
                System.out.println("Enter a line you wish to write to the file: ");
                String lineWrite = scan.nextLine();
                f.writeToFile(lineWrite);
                break;

            case 2:
                System.out.println("This is Everything on the File:");
                f.readFromFile();
                break;

            case 3:
                System.out.println("Enter a line you wish to delete from the file: ");
                String lineDelete = scan.nextLine();
                f.deleteFromFile(lineDelete);
                break;
        }
    }
    System.exit(0);
}

Другие вопросы по теме