Java 异常处理和循环继续
Posted
技术标签:
【中文标题】Java 异常处理和循环继续【英文标题】:Java Exception Handling and loop continuation 【发布时间】:2019-01-15 07:17:18 【问题描述】:所以这是针对硬件问题的。这是 1 到 10 之间数字的猜谜游戏。我必须创建两个异常类: 1.处理猜测 2.如果用户超过5次猜测
如果用户输入的格式不正确,还有第三个要求(但这并不要求我创建额外的异常类。
我的问题是,我希望用户无论输入什么内容,都可以尝试 5 次,无论是 5 次还是 15 次。我可以对超出范围的任何猜测执行此操作,但是当我输入无效格式时,如“五”循环变为无限。我究竟做错了什么?提前致谢:
import java.util.Random;
import java.util.Scanner;
public class GuessingGame
/**
* @param args the command line arguments
*/
public static void main(String[] args)
final int MAX_ATTEMPTS = 5; // Stores maximum number of attempts
int answer; // Stores answer
int attempts = 1; // Stores nubmer of attempts
int guess; // Stores user's guess
boolean checkAnswer = true; // Loop control variable
// Create Scanner object for keyboard input
Scanner keyboard = new Scanner(System.in);
// Generate random nubmer between 1 and 10
answer = generateNumber();
/**
* Allow user to guess (up to five times) what the random number is. Includes
* exception handling for guesses that are outside of the range of 1 and 10,
* have exceeded 5 guesses, and are invalid formats and/or data types.
**/
while (checkAnswer)
try
// Prompt user for input
System.out.println("Please guess a number between 1 and 10");
System.out.println("HINT: " + answer);
guess = keyboard.nextInt();
// Throw exception if user exceeds 5 guesses
if (attempts > MAX_ATTEMPTS)
throw new TooManyGuessesException(attempts);
// Throw exception if user guesses outside of range
else if ((guess > 10) || (guess < 1))
throw new BadGuessException(guess);
// Prompt user that guess is correct and exit loop
else if (guess == answer)
if (attempts == 1)
System.out.println("YOU WIN!! Wow!! You made "
+ attempts
+ " attempt and guessed it on the "
+ "first try!");
else
System.out.println("YOU WIN!! You made " + attempts + " attempts");
checkAnswer = false;
else
attempts++; // increment attempts if no correct guess
// Handles guesses that are outside of range
catch (BadGuessException e)
attempts++;
System.out.println(e.getMessage());
continue;
// Handles exception if user exceeds maximum attempts
catch (TooManyGuessesException e)
checkAnswer = false;
System.out.println(e.getMessage());
// Handles exception if user enters incorrect format
catch (Exception e)
attempts++;
System.out.println("Sorry, you entered an invalid number " + "format.");
break;
/**
* <b>generateNumber method</b>
* <p>
* Generates and returns 1 random number between 1 and 10 inclusive
* </p>
*
* @return A random number between 1 and 10 inclusive.
*/
public static int generateNumber()
int randomNumber; // Store lotto number 1
final int RANGE = 10; // Sets range of random number
// Create random object
Random rand = new Random();
// Generate a random value
randomNumber = rand.nextInt(RANGE) + 1;
return randomNumber;
【问题讨论】:
我不清楚您的要求。您是否希望用户即使输入无效格式(例如“五”)也尝试 5 次? 实际上你的程序在进入catch(Exception e)
之后就结束了,因为你打破了循环。
无关:请始终使用 大括号 ,即使对于单个 if/else 块也是如此。这些东西很容易出错,所以总是使用完整的块。
无论任务背后的动机是什么(家庭作业、摆弄或生产性代码),对控制流使用异常总是不好的做法。
【参考方案1】:
当你输入 '5' 时,方法 nextInt() 抛出 InputMismatchException,然后你进入 catch 块并中断循环。
catch(Exception e)
attempts++;
System.out.println("Sorry, you entered an invalid number "
+ "format.");
break;
Java Language Specification
14.12.1。 while 语句的突然完成 包含的 Statement 的突然完成按以下方式处理:
如果语句的执行由于没有标签的中断而突然完成,则不 >采取进一步的行动,while 语句正常完成。
如果语句的执行由于没有标签的 continue 而突然完成,>那么整个 while 语句将再次执行。
如果语句的执行由于标签 L 的继续而突然完成,>那么有一个选择:
如果while语句有标签L,那么整个while语句会再次执行。
如果 while 语句没有标签 L,则 while 语句会突然完成>因为带有标签 L 的继续。
如果语句的执行由于任何其他原因突然完成,则 while >语句出于同样的原因突然完成。
由于标签中断而突然完成的情况由标签语句的一般规则处理(第 14.7 节)。
【讨论】:
抱歉,我刚刚意识到我遇到了“中断”,我在使用“继续”并切换到“中断”时遇到了错误,但这并不是我真正想要解决这个问题的方式。【参考方案2】:当您调用 nextInt()
但下一个数据不是 int 时,您会得到一个异常。
注意:这不会消耗导致问题的单词,它只会引发异常。
因此,当您再次尝试时,您会得到相同的结果。您很可能想要丢弃文本行的其余部分。在重试之前,我会添加对 nextLine()
的调用以读取该行的其余部分。
【讨论】:
@NamNgo,如果你愿意,你可以投票并勾选答案以接受它。以上是关于Java 异常处理和循环继续的主要内容,如果未能解决你的问题,请参考以下文章