没有捕获多个异常

时间:2018-03-27 10:37:32

标签: java exception-handling

如果输入介于1-26之间,则返回值。当我输入一个超过27或一个字母的数字时,它不会捕获并处理异常,只会跳过该行继续循环。

为什么会这样做,我该如何解决这个问题?

 public int checkInput(int userInput) {

    boolean valid = false;

    do {
        try {
            if (userInput <= 26 || userInput > 0) {
                break;
            }
            valid = true;

        } catch (NumberFormatException | InputMismatchException |
                 ArrayIndexOutOfBoundsException e) {
            valid = false;
            System.out.println("The input is invalid, please enter the answer again.");
            userInput = sc.nextInt();
        }
    } while (!valid);

    return userInput;
}

提前致谢

2 个答案:

答案 0 :(得分:0)

正如ThomasKläger所写,永远不会达到catch条款。 try子句中没有任何内容会抛出异常:

if (userInput <= 26 || userInput > 0) {
    break;
}
valid = true;

您还没有提供所有代码,因为我们无法看到checkInput(int)的调用方式。 但我认为你这样称呼它:

public void takeInput() {
    int input = sc.nextInt();
    checkInput(input);
}

异常发生在int input = sc.nextInt()行,但try条款未涵盖此内容。

您正在将异常用作控制流的一部分。 这被认为是不好的做法,请参阅https://softwareengineering.stackexchange.com/questions/189222/are-exceptions-as-control-flow-considered-a-serious-antipattern-if-so-why

以下按预期工作。

package main;

import java.util.Scanner;

public class ExceptionHandling {
    public static void main(String[] args) {
        final ExceptionHandling exceptionHandling = new ExceptionHandling();
        exceptionHandling.getInputUntilValid();
    }

    private final Scanner scanner;

    public ExceptionHandling() {
        this.scanner = new Scanner(System.in);
    }

    public void getInputUntilValid() {
        boolean isValidInput = false;
        while (!isValidInput) {
            if (scanner.hasNext()) {
                Optional<Integer> integerInput = getInt();
                isValidInput = checkInput(integerInput);
                if (!isValidInput) {
                    System.out.println("The input is invalid, please enter the answer again.");
                }
            }
        }
        System.out.println("Valid.");
    }

    private Optional<Integer> getInt() {
        if (scanner.hasNextInt()) {
            int input = scanner.nextInt();
            return Optional.of(input);
        }
        else {
            scanner.next();
            return Optional.empty();
        }
    }

    private boolean checkInput(Optional<Integer> input) {
        return input.map(value -> checkBounds(value)).orElse(false);
    }

    private boolean checkBounds(int userInput) {
        return 0 < userInput && userInput <= 26;
    }
}

答案 1 :(得分:0)

试试这个。我只是尝试使用递归概念。

import java.util.Scanner;

public class TestRun {

    static int first_value = 27;

    public static void main(String args[]) {

        int value = checkInput2(first_value);

        System.out.println(value);

    }

    public static int checkInput2(int userInput) {

        if (!checkvalue(userInput)) {

            try {
                Scanner sc = new Scanner(System.in);
                System.out.println("The input is invalid, please enter the answer again.");
                userInput = sc.nextInt();
                checkInput2(userInput);

            } catch (Exception e) {
                checkInput2(first_value);
            }
        }
        return userInput;
    }

    public static boolean checkvalue(int userInput) {

        if (userInput <= 26 && userInput > 0) {
            return true;
        }
        return false;
    }
}