Несколько, если в блоке выключателя

У меня вопрос, как я могу выполнить несколько проверок внутри корпуса выключателя? Мне нужно сделать пару проверок в случае 2, но добавив второй блок if, мое приложение ничего не делает, оно просто зависает. В чем я был неправ?

BufferedReader inputCommand = new BufferedReader(new InputStreamReader(System.in));

        while (true) {
                    System.out.println("Instruction:");
                    System.out.println();
                    System.out.println("1 -- Show all product at the store");
                    System.out.println("2 -- Add the product at the client basket");
                    System.out.println("3 -- Show client basket");
                    System.out.println();
                    switch (inputCommand.readLine()) {
                        case "1":
                            basketCommand.get();
                            System.out.println();
                            break;
                        case "2":
                            System.out.println();
                            System.out.println("Select product to add into your basket");
                            if (inputCommand.readLine().equals("su")){
                                basketCommand.addIntoBasket(productContainer.productList.get("su"));
                            }
                            if (inputCommand.readLine().equals("an")){
                                basketCommand.addIntoBasket(productContainer.productList.get("an"));
                            }
                            break;
    }

Как правило, вам вообще не следует выполнять сложные операции в операторах switch, вместо этого вы должны создать новый метод; в данном случае на ум приходит selectProduct.

Maarten Bodewes 14.08.2018 12:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
267
5

Ответы 5

Во втором операторе case вы должны прочитать следующий ввод только один раз:

BufferedReader inputCommand = new BufferedReader(new InputStreamReader(System.in));

while (true) {
    System.out.println("Instruction:");
    System.out.println();
    System.out.println("1 -- Show all product at the store");
    System.out.println("2 -- Add the product at the client basket");
    System.out.println("3 -- Show client basket");
    System.out.println();
    switch (inputCommand.readLine()) {
    case "1":
        basketCommand.get();
        System.out.println();
        break;
    case "2":
        System.out.println();
        System.out.println("Select product to add into your basket");

        String next = inputCommand.readLine();
        if (next.equals("su")) {
            basketCommand.addIntoBasket(productContainer.productList.get("su"));
        }
        else if (next.equals("an")) {
            basketCommand.addIntoBasket(productContainer.productList.get("an"));
        }
        break;
    }
}

Правильно, вы здесь +1

iamsankalp89 14.08.2018 12:16

Ваш первый оператор if поглощает строку ввода, поэтому второму оператору if нечего читать.

Просто сохраните строку после ее однократного прочтения:

                String readLine = inputCommand.readLine();

                if (readLine.equals("su")){
                    basketCommand.addIntoBasket(productContainer.productList.get("su"));
                }
                else if (readLine.equals("an")){
                    basketCommand.addIntoBasket(productContainer.productList.get("an"));
                }

Заменить if на else if

case "2":
     System.out.println();
     System.out.println("Select product to add into your basket");
     if (inputCommand.readLine().equals("su")){
        basketCommand.addIntoBasket(productContainer.productList.get("su"));
     }
     else if (inputCommand.readLine().equals("an")){
     basketCommand.addIntoBasket(productContainer.productList.get("an"));
     } 
     break;

Правильное решение, неправильная проблема. Ошибка заключается в том, что оба if запрашивают ввод, тогда как им нужно просто тестировать результат ввода, выполненного до первого if.

Kevin Anderson 14.08.2018 12:42

Каждый раз, когда вы делаете inputCommand.readLine(), программа ждет ввода с вашей стороны. Вы не можете сравнить отдельные входные данные, как в этом примере. Лучшим способом было бы сохранить ввод в переменной, а затем выполнить ваши проверки. Что-то вроде этого будет работать (не проверено):

BufferedReader inputCommand = new BufferedReader(new InputStreamReader(System.in));
    while (true) {
                System.out.println("Instruction:");
                System.out.println();
                System.out.println("1 -- Show all product at the store");
                System.out.println("2 -- Add the product at the client basket");
                System.out.println("3 -- Show client basket");
                System.out.println();
                switch (inputCommand.readLine()) {
                    case "1":
                        basketCommand.get();
                        System.out.println();
                        break;
                    case "2":
                        System.out.println();
                        System.out.println("Select product to add into your basket");
                        String input = inputCommand.readLine();
                        if (input.equals("su")){
                            basketCommand.addIntoBasket(productContainer.productList.get("su"));
                        }
                        if (input.equals("an")){
                            basketCommand.addIntoBasket(productContainer.productList.get("an"));
                        }
                        break;
}

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

1. Не забудьте закрыть класс Scanner.

2. всегда преобразуйте ввод цифр в нижний регистр (рассмотрите случай «q» против «Q»)

3. каждый раз, когда вы выполняете "scanner.nextLine ()", ваша программа будет останавливаться и ждать ввода от источника (в этом случае System.in настроен на ввод с клавиатуры)

4.System.out.println напечатает '\ n' на экране в конце своего ввода, что приведет к созданию новой строки, вы можете использовать этот символ внутри своей строки для сохранения строк кода.

Полный код:

import java.util.Scanner;
import java.io.IOException;

public class MyClass {

public static void ShowMenu()
{
      System.out.println("\nInstruction:");
      System.out.println("1 -- Show all product at the store");
      System.out.println("2 -- Add the product at the client basket");
      System.out.println("3 -- Show client basket");
      System.out.println("q -- Quit Program");


}

public static void ProductMenu()
{
      System.out.println("Select product to add into your basket");
      System.out.println();
      System.out.println("ba -- Basketball");
      System.out.println("fi -- Fiat 500");
      System.out.println("ip -- Iphone");
      System.out.println();
}

public static void Exit(Scanner sc) {
    sc.close();
    System.out.println("You've exited the program. goodbye!");
    System.exit(1);
}

public static void main(String args[]) {
    Scanner scanner = new Scanner(System.in);
    String inputCommand = null;

    while (true) {
       ShowMenu();
        switch (inputCommand = scanner.nextLine().toLowerCase()) {
            case "1":
                System.out.println("you entered 1");
                break;
            case "2":
                ProductMenu();
                inputCommand = scanner.nextLine(); //should block

                if (inputCommand.equals("ba")){
                    System.out.println("Basketball added.");
                }
                if (inputCommand.equals("fi")){
                    System.out.println("Fiat 500 added.");


                }
                if (inputCommand.equals("ip")){
                    System.out.println("Iphone added.");

                }
                break;

            case "q":
                Exit(scanner);
                break;
            default:
                System.out.println("Invalid Input");
                break;
        }
   }

}

}

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