如果输入介于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;
}
提前致谢
答案 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;
}
}