gpt4 book ai didi

java - try-catch 语句在捕获异常时不返回 try block

转载 作者:行者123 更新时间:2023-11-29 05:26:39 28 4
gpt4 key购买 nike

我有一个写的方法。此方法仅扫描用户输入的整数输入。如果用户输入一个字符值,它将抛出一个输入不匹配异常,这是在我的 Try-Catch 语句中处理的。问题是,如果用户输入任何不是数字的东西,然后抛出异常,我需要该方法循环回来再次要求用户输入。据我了解,如果捕获到错误,Try catch 语句会自动循环回 Try block 。这不对吗?请指教。

这是我的方法(非常简单):

public static int getMask() {
//Prompt user to enter integer mask
Scanner keyboard = new Scanner(System.in);
int output = 0;
try{
System.out.print("Enter the encryption mask: ");
output = keyboard.nextInt();
}
catch(Exception e){
System.out.println("Please enter a number, mask must be numeric");
}
return output;
}//end of getMask method

以下是该方法在我的程序中的实现方式:

//get integer mask from user input
int mask = getMask();
System.out.println("TEMP mask Value is: " + mask);

/************ *************** ********/这是我更新的代码。它创建了一个我无法逃脱的无限循环。我不明白为什么我要为此苦苦挣扎。请帮忙。

public static int getMask() {
//Prompt user to enter integer mask
Scanner keyboard = new Scanner(System.in);
int output = 0;
boolean validInput = true;

do{
try {
System.out.print("Enter the encryption mask: ");
output = keyboard.nextInt();
validInput = true;
}
catch(InputMismatchException e){
System.out.println("Please enter a number, mask must be numeric");
validInput = false;
}
}while(!(validInput));

return output;

/************ ********/FINAL_ANSWER我终于能够得到它。我想我只需要更多地研究 boolean 逻辑。有时它让我头晕目眩。使用整数测试实现循环效果很好。我想是我自己的用户错误。这是我的最终代码,可以正常工作并具有更好的异常处理。如果您有任何批评,请在评论中告诉我。

//get integer mask from user input
int repeat = 1;
int mask = 0;
do{
try{

mask = getMask();
repeat = 1;
}
catch(InputMismatchException e){
repeat = 0;
}
}while(repeat==0);

最佳答案

To my understanding, a Try catch statement automatically loops back to the Try block if an error is caught. Is this not correct?

不,这是不正确的,我很好奇您是如何得出这种理解的。

您有几个选择。例如(这不会按原样工作,但让我们先谈谈错误处理,然后阅读下文):

// Code for illustrative purposes but see comments on nextInt() below; this
// is not a working example as-is.
int output = 0;
while (true) {
try{
System.out.print("Enter the encryption mask: ");
output = keyboard.nextInt();
break;
}
catch(Exception e){
System.out.println("Please enter a number, mask must be numeric");
}
}

等等;您选择的选项通常取决于您的偏好(例如 fge's answer 是相同的想法但略有不同),但在大多数情况下直接反射(reflect)了您正在尝试做的事情:“继续询问直到用户输入有效数字”

另请注意,就像提到的 fge 一样,您通常应该捕获您准备处理的最严格的异常。 nextInt() 抛出一些不同的异常,但您的兴趣特别在于 InputMismatchException。您不准备处理,例如 IllegalStateException —— 更不用说如果抛出意外异常会使调试/测试变得困难,但您的程序假装它们只是与无效输入有关(因此永远不会通知您发生了不同的问题)。

现在,也就是说,Scanner.nextInt() 这里还有另一个问题,如果 token 不能被解析为整数,它就会留在流中。如果您不从流中删除该 token ,这将使您陷入循环。为此,您实际上想要使用 next()nextLine(),以便无论如何始终使用 token ;然后你可以用 Integer.parseInt() 解析,例如:

int output = 0;
while (true) {
try{
System.out.print("Enter the encryption mask: ");
String response = keyboard.next(); // or nextLine(), depending on requirements
output = Integer.parseInt(response);
break;
}
catch(NumberFormatException e){ // <- note specific exception type
System.out.println("Please enter a number, mask must be numeric");
}
}

请注意,这仍然直接反射(reflect)了您想要做的事情:“一直询问,直到用户输入有效数字,但无论他们输入什么,都会消耗输入。”

关于java - try-catch 语句在捕获异常时不返回 try block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22440567/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com