Получение IllegalStateException в моей программе? - PullRequest
0 голосов
/ 09 мая 2018

Stacktrace Here

import java.util. *;

открытый класс AccountClient {

public static void main(String[] args)  {
    Scanner input = new Scanner(System.in);
    boolean infiniteLoop = true;
    boolean invalidInput;
    int id;
    // Create array of different accounts
    Account[] accountArray = new Account[10];
    //Initialize each account array with its own unique id and a starting account balance of $100
    for (int i = 0; i < accountArray.length; i++) {
        accountArray[i] = new Account(i, 100);
    }
    do {    
        try {       
            //inner loop to detect invalid Input
            do {
                invalidInput = false;
                System.out.print("Enter an id: ");
                id = input.nextInt(); 
                if (id < 0 || id > 9) {
                    System.out.println("Try again. Id not registered in system. Please enter an id between 0 and 9 (inclusive).");
                    invalidInput = true;
                    input.nextLine();
                }           
            } while (invalidInput);
            boolean exit;
            do {
                exit = false;
                boolean notAnOption;
                int choice;
                do {
                    notAnOption = false;
                    System.out.print("\nMain Menu\n1: check balance\n2: withdraw\n3: deposit\n4: exit\nEnter a choice: ");
                    choice = input.nextInt();
                    if (choice < 1 || choice > 4) {
                        System.out.println("Sorry, " + choice + " is not an option. Please try again and enter a number between 1 and 4 (inclusive).");
                        notAnOption = true;
                    }
                } while(notAnOption);
                switch (choice) {
                case 1: System.out.println("The balance for your account is $" + accountArray[id].getBalance());
                    break;
                case 2: {
                    boolean withdrawFlag;
                    do {
                        System.out.print("Enter the amount you would like to withdraw: ");
                        double withdrawAmount = input.nextInt();
                        if (withdrawAmount > accountArray[id].getBalance()) {
                            System.out.println("Sorry, you only have an account balance of $" + accountArray[id].getBalance() + ". Please try again and enter a number at or below this amount.");
                            withdrawFlag = true;
                        }
                        else {
                            accountArray[id].withdraw(withdrawAmount);
                            System.out.println("Thank you. Your withdraw has been completed.");
                            withdrawFlag = false;
                        }
                    } while (withdrawFlag);
                }

                    break;
                case 3: {
                    System.out.print("Enter the amount you would like to deposit: ");
                    double depositAmount = input.nextInt();
                    accountArray[id].deposit(depositAmount);
                    System.out.println("Thank you. You have successfully deposited $" + depositAmount + " into your account.");
                    }
                    break;
                case 4: {
                    System.out.println("returning to the login screen...\n");
                    exit = true;
                    }
                    break;
                }

            } while (exit == false);

        }

        catch (InputMismatchException ex) {
            System.out.println("Sorry, invalid input. Please enter a number, no letters or symbols.");
        }
        finally {
            input.close();          
            }

        } while (infiniteLoop);
    } 


}

Код исключения:

Exception in thread "main" java.lang.IllegalStateException: Scanner closed
    at java.util.Scanner.ensureOpen(Scanner.java:1070)
    at java.util.Scanner.next(Scanner.java:1465)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at playground.test.main.Main.main(Main.java:47)

Здравствуйте, я создал базовую программу, которая использует класс под названием account для симуляции банкомата. Я хотел создать исключение, если пользователь не набрал письмо. Это работало нормально, однако мне нужно было сделать это зацикливанием, чтобы программа не завершилась после того, как выдало исключение. Чтобы сделать это, я просто поместил триггер try в цикл do while, который у меня был ранее. Однако когда я сделал это, он генерирует исключение IllegalStateException каждый раз, когда я набираю письмо или выбираю выход из внутреннего цикла, который у меня есть, который возвращает пользователя к циклу с просьбой ввести свой идентификатор. Что такое IllegalStateException, что вызывает его в моем случае, и как мне это исправить? Спасибо.

1 Ответ

0 голосов
/ 09 мая 2018

Это довольно просто, после того как вы поймаете исключение, будет выполнено предложение finally. К сожалению, вы закрываете сканер в этом пункте, а Scanner.close() закрывает основной входной поток (System.in в этом случае).

Стандартный входной поток System.in после закрытия не может быть открыт снова.

Чтобы исправить это, вы должны опустить предложение finally и закрыть сканер, когда ваша программа должна завершиться, а не раньше.

...