如何创建适当的自定义异常类?

时间:2015-12-16 20:27:12

标签: java oop exception-handling

我正在尝试创建自定义异常类,但我遇到了很多麻烦。有人可以帮我吗!我刚刚开始编程,我希望得到一些指示。

import java.util.Random;
import java.util.Scanner;
import java.util.InputMismatchException;

public class GuessingGame {

    public static void main(String[]args) throws BadGuessException
    {
        int min = 1;
        int max = 10;
        Random rand = new Random();

        int numberToGuess = rand.nextInt((max - min) + 1) + min;    

        Scanner input = new Scanner(System.in);
        int guess;
        boolean win = false; 
        int numberOfTries = 0;

        while (!win) 
        {

            System.out.println("Guess a number between 1 and 10: ");
            try
            {
                guess = input.nextInt();
                numberOfTries++;


                if (guess == numberToGuess)
                {       
                    win = true;
                    System.out.println("YOU GOT IT!");
                    System.out.println("It took you " + numberOfTries + " tires.");

                }
                else
                {
                    throw new BadGuessException();
                }
            }
            catch(InputMismatchException e)
            {
                e.getMessage();
            }
        }
    }

}


    import java.util.*;

public class BadGuessException extends Exception {

    String message = "Sorry, that was an invalid guess!";

    //Default Constructor 
    public BadGuessException()
    {
        super();
    }

    //Parameterized Constructor
    public BadGuessException(Throwable cause)         
    {  
      super(cause);        
    }      

}

我应该创建2个构造函数,一个默认值,一个参数化。如果用户输入1-10之间的数字,我应该在一个catch块中捕获它并打印消息"无效猜测"如果他们输入一个字母或其他东西,输出应该是"输入无效" (我应该在BadGuessException中捕获无效输入然后将其传递给InputMismmatch吗?如果是这样,我该怎么做?) 现在,当我运行这段代码时,如果我输入一个字母,它不会崩溃,但是while循环不断迭代,我无法再输入任何输入。它只是不断重复"猜数字在1-10之间。"

我假设它是因为一旦try块执行一次,它就不会再次执行了?我该如何解决?对不起任何困惑,很高兴澄清!任何帮助深表感谢。

另外,我不确定如何同时捕获2个不同的异常。一个用于无效猜测,一个用于无效输入。 :/

3 个答案:

答案 0 :(得分:0)

我认为你想要的是如果他们猜测它是不正确的,你的循环应该再次运行,对吧?在这种情况下,您应该调整循环,如下所示。此外,在捕获InputMismatchException的地方,您正在吞下异常而不打印它或处理它:这是非常糟糕的做法。我也为你更新了这个。

while (!win) 
        {

            System.out.println("Guess a number between 1 and 10: ");
            try
            {
                guess = input.nextInt();
                numberOfTries++;

                win=true;

                if (guess == numberToGuess)
                {       
                    win = true;
                    System.out.println("YOU GOT IT!");
                    System.out.println("It took you " + numberOfTries + " tires.");

                }
                else
                {
                    throw new BadGuessException();
                }
            }
            catch(InputMismatchException e)
            {
                System.out.println("Please input a number betwee 1 and 10!");
            }
            catch(BadGuessException ex) {
                System.out.println("Sorry, you guessed the wrong number!");
            }
        }

答案 1 :(得分:0)

应该使用例外来处理错误,无效输入,非法,异常情况。如果没有猜测正确的数字是一个错误,那听起来不是一个心灵读者就是一个错误。所以BadGuessException在这里被误用了。

为了更好的用例,如何为非感知输入抛出此异常?例如,由于程序要求用户输入1到10之间的数字,输入-3或99显然是错误。

可以相应地修正中间的循环:

while (!win) {
    System.out.println("Guess a number between 1 and 10: ");
    try {
        guess = input.nextInt();
        numberOfTries++;

        if (guess == numberToGuess) {
            win = true;
            System.out.println("YOU GOT IT!");
            System.out.println("It took you " + numberOfTries + " tires.");
        } else if (guess < 1 || guess > 10) {
            throw new BadGuessException();
        }
    } catch (InputMismatchException e) {
        input.nextLine();
    }
}

至于创建自定义异常类,您已经这样做了。它写得有点凌乱,清理它(删除不必要的东西)就变成了:

public class BadGuessException extends Exception {

    private static final String message = "Sorry, that was an invalid guess!";

    public BadGuessException() {
        super(message);
    }
}

更新

我修复了代码中的另一个错误:如果输入非整数输入,则会抛出InputMismatchException。反复。永远。 这是因为input.nextInt() 如果输入无效,则不会消耗输入。因此无效输入保持不变,input.nextInt()将继续失败,使您的程序无限循环。

要解决此问题,您必须以某种方式消耗错误的输入,例如通过阅读以下行:

    } catch (InputMismatchException e) {
        input.nextLine();
    }

答案 2 :(得分:0)

你永远不会捕获BadGuessException,因此它将被抛出while循环,程序将退出。如果要继续,必须在循环内捕获异常。

我同意janos的观点,即这不是对例外的好用。猜错是正常游戏流程的一部分,不是吗?

但是为了练习,我将例如将循环中的所有逻辑拉入一个新的私有方法,让它抛出这个异常,并在循环中捕获它。您可以像这样连续捕获多个异常。

while (!win) {
    try {
        win = makeGuess();
    } catch (InputMismatchException e) {
            e.getMessage();
    }  catch (BadGuessException e) {
        System.out.println("Wrong guess");
    } 
}

private boolean makeGuess() throws BadGuessException, InputMismatchException {
   ...
 }