Java если еще с вложенным циклом

У меня возникли некоторые проблемы с моим назначением Java, и в настоящее время я застрял в вложенном операторе if else. Я на самом деле пытаюсь получить возраст ввода от пользователя и сохранить его как переменную. После выполнения кода я получаю ошибку при запуске Я делаю это правильно или есть какой-то другой способ запрограммировать это?

Сообщение об ошибке, которое я получил

    Введите ваш выбор: 
    1
    Вы выбрали № 1
    Пожалуйста, введите ваш возраст ** Исключение в теме "главная" 
    java.lang.IllegalStateException: сканер закрыт
    at java.util.Scanner.ensureOpen(неизвестный источник)
    at java.util.Scanner.next(Неизвестный источник)
    at java.util.Scanner.nextInt(Неизвестный источник)
    at java.util.Scanner.nextInt(Неизвестный источник)
    at Assignment.main(Assignment.java:48)**
public static void main(String args[]) {
    Scanner sc = new Scanner(System.in);
    System.out.println(
       "1. Add player" + "\n" +
       "2.Display transaction" + "\n" +
       "3.Begin the ride");
    System.out.println("");
    System.out.println("Enter your selection: ");
    char selection = sc.findInLine(".").charAt(0);
    sc.close();
    switch(selection)  {
    case '1' :
        System.out.println("You have selected No.1");
        break;
    case '2' :
        System.out.println("You have selected No.2" );
        break;
    case '3' :
        System.out.println("You have selected No.3" );
        break;  
    default: 
        System.out.println("Please make a selection");
        break; 
   }
   if (selection=='1') {  
        int age=0;
        System.out.print("Please enter your age");
        age = sc.nextInt();
        while (age<100) {
            age+=age;
        }
    }       
    else if (selection=='2') {
        System.out.println("Display daily transaction");
    }
    else if (selection=='3') {
        System.out.println("Begin the ride");
    }
    else {
        System.out.println("Please enter a valid input");
    }
}

4 ответа

Решение

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

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

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;

public class SwitchCase {

    public static Map<Integer, String> options = new LinkedHashMap<Integer, String>();
    static {
        options.put(1, "Add player");
        options.put(2, "Display transaction");
        options.put(3, "Begin the ride");
    }

    public static void main(String args[]) {
        Scanner sc = new Scanner(System.in);
        for (Integer option : options.keySet()) {
            System.out.println(option + ". " + options.get(option));
        }
        System.out.println("Enter your selection: ");
        int selection = sc.nextInt();
        switch (selection) {
        case 1:
        case 2:
        case 3:
            System.out.println("You have selected No." + selection);
            break;
        default:
            System.out.println("Please make a selection");
            break;
        }
        if (selection == 1) {
            int age = 0;
            System.out.print("Please enter your age : ");
            age = sc.nextInt();
            while (age < 100) {
                age += age;
            }
            System.out.println(age);
        } else if (selection == 2) {
            System.out.println(options.get(selection));
        } else if (selection == 3) {
            System.out.println(options.get(selection));
        } else {
            System.out.println("Please enter a valid input!");
        }
    }
}

Пожалуйста, прочтите основную Java, чтобы вы могли лучше изучать программы.

Исключение довольно ясно по проблеме: java.lang.IllegalStateException: Scanner closed

Прежде чем ваш код вводит switchзакрываешь сканер с sc.close();, Но позже вы пытаетесь прочитать это снова:

if (selection=='1') {  
    int age=0;
    System.out.print("Please enter your age");
    age = sc.nextInt();  // <---- Here
    while (age<100) {
        age+=age;
    }
}  

Но это не удастся, если сканер уже закрыт. Чтобы решить эту проблему, вы можете просто поставить строку sc.close() до конца вашего main,

В качестве альтернативы вы можете поместить все в блок try-with-resources, чтобы вам больше не приходилось закрывать сканер, потому что он будет закрыт автоматически после выхода из блока.

Регистр переключателя - это тип вложенности, если else. мы можем использовать switch вместо вложенной, если else. Вам не нужно использовать регистр switch и одновременно вложенную if else. Вы можете написать свой код, как это.

public static void main(String args[]) {

    Scanner sc = new Scanner(System.in);
    System.out.println("1. Add player" + "\n" +
       "2.Display transaction" + "\n" +
       "3.Begin the ride");
    System.out.println("");
    System.out.println("Enter your selection: ");
    char selection = sc.findInLine(".").charAt(0);

    switch(selection)  {

    case '1' :
        System.out.println("You have selected No.1");
        int age=0;
        System.out.print("Please enter your age");
        age = sc.nextInt();
        while (age<100) {
            age+=age;
        }
        System.out.print(age);
        break;

    case '2' :

        System.out.println("You have selected No.2" );
        System.out.println("Display daily transaction");
        break;

    case '3' :

        System.out.println("You have selected No.3" );
        System.out.println("Begin the ride");
        break;  

    default: 

        System.out.println("Please make a selection");
        System.out.println("Please enter a valid input");
        break; 

   }
    sc.close();
}
Другие вопросы по тегам