Java-метод, похоже, пропускает шаг при втором вызове - PullRequest
0 голосов
/ 03 июля 2018

Я пишу простую программу «корзина для покупок» на Java, я совсем не пользовался ею за последние 10 лет, я просто пытаюсь ознакомиться с ней снова ...

В моей программе 3 класса: Program.java, Basket.java & Item.java.

Program.java определяется как:

public class Program {

    public static int menuSelection = 0;
    public static Scanner kb = new Scanner(System.in);
    public static Basket basket = new Basket();

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //Program p = new Program();
        menu();
    }

    public static void menu() {
        System.out.println("Press 1 to add an item to the basket. ");
        System.out.println("Press 2 to remove an item from the basket. ");
        System.out.println("Press 3 to display the basket contents. ");
        System.out.println("Press 9 to proceed to checkout. ");
        System.out.println("Press 0 to exit program");
        menuSelection = kb.nextInt();

        if(menuSelection == 1) {
            basket.addItemToBasket();
        } else if(menuSelection == 2) {
            basket.removeItemFromBasket();
        } else if (menuSelection == 3) {
            basket.displayBasket();
        } else if(menuSelection == 9) {
            System.out.println("Proceed to checkout");
        } else if(menuSelection == 0) {
            System.exit(0);
        }
    }

}

Basket.java определяется как:

public class Basket {

    public ArrayList<Item> basket = new ArrayList<Item>();
    public Scanner kb = new Scanner(System.in);
    public Item item = new Item();
    public Program prog = new Program();

    public void addItemToBasket() {
        System.out.println("Enter the name of the item: ");
        item.name = kb.nextLine();
        System.out.println("Enter the price of the item: ");
        item.price = kb.nextDouble();
        basket.add(item);
        item.name = null;
        item.price = 0;
        Program.menu();
    }

    public void removeItemFromBasket() {
        System.out.println("Which item would you like to remove? ");
        item.name = kb.nextLine();
        if(basket.contains(item.name) ) {
            basket.remove(item);
        } else {
            System.out.printf("There is no %s currently in the basket! ", item.name);
        }
    }

    public String displayBasket() {
        return basket.toString();
    }



}

В настоящий момент, если я запускаю программу, в консоли отображается меню, и когда я выбираю '1', вызывается метод addItemToBasket(), я вводю имя в первом запросе и цену во втором после этого появится меню.

Однако в этот момент, если я затем снова выберу «1», чтобы добавить еще один элемент в корзину, первая и вторая подсказки отображаются вместе ... то есть вместо:

Введите название товара:

// Ожидание ввода пользователя

Введите цену товара:

// Ожидание ввода пользователя

показывает:

Введите название товара:

Введите цену товара:

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

Что я делаю не так? Почему метод addItemToBasket() пропускает строку item.name = kb.nextLine(); во второй и последующий раз, когда он вызывается?

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Как точка @Spidy, это связано с вашим входным потоком. Посмотрите на это, 2 сканера совместно используют один и тот же поток ввода:

new Scanner(System.in);

Так что, когда вы делаете nextLine (), он ожидает ввода новой строки. Быстрое исправление будет вместо nextLine (), используйте только next ().

P / S: Проверьте комментарий от @azro, у вас есть неиспользованный код в классе Basket.

0 голосов
/ 03 июля 2018

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

Вот более подробное объяснение. Программа создает сканер с именем kb и считывает следующее целое число, для которого вы вводите 1. Затем экземпляр Basket kb читает всю строку. Такое ощущение, что он пропускает это чтение, но фактически читает с самого начала потока. Если вы напечатаете item.name, вы увидите 1. Теперь он запрашивает цену. Вы вводите номер, который читается очень хорошо, и возвращаетесь в главное меню. Тем не менее, в главном меню, которое в последний раз прочитало 1, по-прежнему есть все остальные входные данные, которые вы ввели для просмотра корзины. Вот почему он злится на ожидание двойного и получение недопустимых символов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...