Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建适当的自定义异常类?_Java_Oop_Exception Handling - Fatal编程技术网

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

Java 如何创建适当的自定义异常类?,java,oop,exception-handling,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 {

我试图创建一个自定义异常类,但遇到了很多麻烦。有人能帮帮我吗!我最近才开始编程,我希望能得到一些建议

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);        
    }      

}
我应该创建两个构造函数,一个是默认的,一个是参数化的。如果用户输入的数字介于1-10之间,我应该在catch块中捕获它并打印消息“invalid guess”,如果他们输入字母或其他内容,输出应该类似于“invalid input”(我应该在BadGuessException中捕获无效输入,然后将其传递给InputMismmatch吗?如果是,我该如何做?) 现在,当我运行这段代码时,如果我输入一个字母,它不会崩溃,但是while循环会不断迭代,我无法输入更多的输入。它只是不断重复“猜一个介于1-10之间的数字。”

我假设这是因为一旦try块执行一次,它就不再执行了?我该如何解决这个问题?很抱歉出现任何混乱,很高兴澄清!非常感谢您的帮助


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

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

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!");
            }
        }

我想你想要的是,如果他们猜错了,你的循环应该再次运行,对吗?在这种情况下,您应该调整您的循环,如下所示。此外,在捕获InputMissatchException时,您会在不打印或处理异常的情况下吞咽异常:这是非常糟糕的做法。我也为你更新了这个

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!");
            }
        }

异常应用于处理错误、无效输入、非法和异常情况。如果猜不到正确的数字是错误的,那听起来好像不是读心术是错误的。所以这里误用了
BadGuessException

对于更好的用例,对于非感测输入抛出此异常如何?例如,由于程序要求用户输入一个介于1和10之间的数字,输入-3或99显然是一个错误

<> P中的环可以相应地校正:

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();
    }
}
更新 我修复了代码中的另一个错误:如果输入非整数输入,将抛出
inputmaschException
。反复地永远。 这是因为如果输入无效,
input.nextInt()
不会使用该输入。因此,无效的输入将留在那里,
input.nextInt()
将继续失败,使程序陷入无限循环

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

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

异常应用于处理错误、无效输入、非法和异常情况。如果猜不到正确的数字是错误的,那听起来好像不是读心术是错误的。所以这里误用了
BadGuessException

对于更好的用例,对于非感测输入抛出此异常如何?例如,由于程序要求用户输入一个介于1和10之间的数字,输入-3或99显然是一个错误

<> P中的环可以相应地校正:

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();
    }
}
更新 我修复了代码中的另一个错误:如果输入非整数输入,将抛出
inputmaschException
。反复地永远。 这是因为如果输入无效,
input.nextInt()
不会使用该输入。因此,无效的输入将留在那里,
input.nextInt()
将继续失败,使程序陷入无限循环

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

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

您永远不会捕获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 {
   ...
 }

您永远不会捕获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 {
   ...
 }

如何同时抛出两个异常?您就快到了。只需在已经存在的
catch
下面添加一个
catch(BadGuessException e){System.out.println(e.getMessage());}
(另外:
e.getMessage();
本身没有任何作用,您需要打印它!)。Idk关于scanner,但也许您需要
input.next()
来获取(并丢弃)该字母。如何同时抛出两个异常?您就快到了。只需在已经存在的
catch
下面添加一个
catch(BadGuessException e){System.out.println(e.getMessage());}
(另外:
e.getMessage();
本身没有任何作用,您需要打印它!)。Idk关于scanner,但也许您需要
input.next()
来获取(并丢弃)那个字母。我还想创建一个参数化构造函数。但是当我查看异常文档时,似乎可以有多个参数。我将使用哪些参数?只是一种一次性的