Try-Catch с циклом do while - PullRequest
0 голосов
/ 20 июня 2020
// Add a New Ship
public static void addShip() {
    // complete this method
    Scanner scan = new Scanner(System.in);
    System.out.println("Enter new Ship name: "); // Ask for ship name
    String shipName = scan.nextLine();
    System.out.print("Balcony: "); // How many Balcony suites
    int balcony = scan.nextInt();
    System.out.print("Ocean View:"); // How many Ocean view suites
    int oceanView = scan.nextInt();
    System.out.print("Room Suite: ");
    int roomSuite = scan.nextInt();
    System.out.print("Room Interior: ");
    int roomInterior = scan.nextInt();
            
    **int y = 1;
    do {
        try {
            System.out.print("In Service: ");
            boolean inService = scan.nextBoolean(); // Ask if the ship is in service
            y=2;
        }
        catch(Exception e) {
            System.out.println("Please enter true if ship is in service.");
            System.out.println("or");
            System.out.print("False if ship is not in service");
        }
    } while (y==1);
    scan.nextLine();
    shipList.add(new Ship(shipName, balcony, oceanView, roomSuite, roomInterior, inService));   //this is the inService error I am referring to
}**

Жирным шрифтом выделено место, где у меня возникли проблемы (начиная со строки 19 и заканчивая 36). Сначала я пытался сделать свое логическое «да» или «нет» вместо истинного или ложного. Когда я не смог это понять, я решил попробовать поймать, чтобы пользователь мог ввести истину или ложь. Произошли две вещи. 1-я переменная inService в строке 36 теперь говорит, что это не может быть разрешено. Поэтому я использовал предложение eclipse и создал поле для inService. Когда я запустил программу и дошел до этой части, l oop никогда не останавливался, мне пришлось отключить консоль вручную. убедитесь, что пользователь не ввел строку типа «три» вместо «3». Я собирался использовать тот же метод, но не могу заставить его работать.

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

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Причина, по которой ваш l oop никогда не останавливается, заключается в том, что вы устанавливаете y = 2 после scan.nextBoolean(), поэтому, если эти методы вызывают исключение, строка с y = 2 будет пропущена, и она достигнет непосредственно улова блок. Поэтому в этом случае вы должны установить y = 2 внутри блока catch, чтобы он работал.

int y = 1;
do {
    try {
        System.out.print("In Service: ");
        boolean inService = scan.nextBoolean(); 
    } catch (Exception e) {
        y = 2;
    }
} while (y==1);

Однако было бы лучше, если вы используете scan.hasNextBoolean() в условии while, чтобы вы могли избежать используя try-catch

while (scan.hasNextBoolean()) {
    System.out.print("In Service: ");
    boolean inService = scan.nextBoolean(); 
}
0 голосов
/ 20 июня 2020

Вам необходимо обработать маркер конца строки сканера независимо от того, был ли введен правильный или неправильный ввод, и поэтому это означает, что вы должны проглотить этот маркер с scan.nextLine() в конце как try, так и catch блоков. Например:

Scanner scan = new Scanner(System.in);
boolean inputOk = false;
boolean inService = false;
do {        
    try {
        System.out.print("In Service: ");
        inService = scan.nextBoolean(); // Ask if the ship is in service
        inputOk = true;
        scan.nextLine();  // ***** add this here ***** 
    } catch (Exception e) {
        System.out.println("Error: bad input. Enter either true or false");
        scan.nextLine();  // *****  add this here ***** 
    }

} while (!inputOk);

System.out.println("inService: " + inService);

if (scan != null) {
    scan.close();
}

Обратите внимание, что я использовал описательную логическую переменную для управления do-while l oop, поскольку она избегает использования «magi c чисел», 1 и 2, делает код самокомментируется, а лог c легче понять.

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