Как повторить код при обнаружении исключения в Java? - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть этот класс "ScanInput":

public final class ScanInput {

    public String outputS;
    public int outputI;

    public ScanInput() {
    }

    public final void scanInt(String text) {

        System.out.print(text);

        @SuppressWarnings("resource")
        Scanner inputI = new Scanner(System.in);
        int input;

        while(true) {
            try {
                input = inputI.nextInt();
                break;
            } catch (Exception e) {
                scanInt(text);
            }
        }
        outputI = input;
    }
}

Вызывается (это правильное слово? Я новичок в java) этим классом "Wow":

public class Wow {
    public static void main(String[] args) {
        ScanInput numbers = new ScanInput();

        numbers.scanInt("INPUT NUMBERS: ");

        System.out.println("You entered: " + numbers.outputI);    
    }
}

Я пытаюсь заставить его повториться, когда целое число не напечатано. Если я набираю целое число в первый раз, оно работает и печатает "You entered: " + numbers.outputI. Если я этого не сделаю, он снова выполнит «INPUT NUMBERS:», но затем он застрянет в al oop и просто напечатает "You entered: " + numbers.outputI); независимо от ввода. Как мне заставить его работать, если первый раз не является целым числом?

Ответы [ 3 ]

1 голос
/ 21 февраля 2020

Следующий код решит вашу проблему. Ключевым моментом является то, что вы должны использовать inputI.next(), чтобы очистить нечисловые строки c в буфере. В противном случае inputI.nextInt() продолжит генерировать исключение, потому что не читая int не будет использовать символ буфера.

public final void scanInt(String text) {
    @SuppressWarnings("resource")
    Scanner inputI = new Scanner(System.in);
    int input;

    while(true) {
        try {
            System.out.print(text);
            input = inputI.nextInt();
            break;
        } catch (Exception e) {
            inputI.next();  // read the token does not match the Integer in buffer
        }
    }
    outputI = input;
}
1 голос
/ 21 февраля 2020

Вызов scanInt изнутри scanInt - это рекурсия, а рекурсия - это один путь к l oop.

Вы также имеют блок while(true); еще один oop. Это две петли. Один л oop слишком много. Удалите один из них, и вы можете сделать эту работу. Либо один; ваш выбор.

0 голосов
/ 21 февраля 2020

Просто еще одна альтернатива. Нет пробовать / ловить требуется:

public int outputI;
private Scanner inputI = new Scanner(System.in);

public final void scanInt(String text) {
    String num = "";
    while(num.equals("")) {
        System.out.print(text);
        num = inputI.nextLine();
        // Is the entry a numerical string?
        if (!num.matches("\\d+")) {
            // No...
            System.out.println("Invalid Entry! Integer Number Only!");
            num = "";  // null string num so as to ensure another loop.
        }

    }
    // Convert string numerical value entry to Integer.
    this.outputI = Integer.parseInt(num);
}
...