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 异常处理和循环继续的主要内容,如果未能解决你的问题,请参考以下文章

java中异常处理

异常处理并在 python 中继续 for 循环

java怎么处理异常让程序继续执行

处理PL-SQL异常并继续循环

异常处理——Java的try catch用法

异常处理机制详解