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()
来获取(并丢弃)那个字母。我还想创建一个参数化构造函数。但是当我查看异常文档时,似乎可以有多个参数。我将使用哪些参数?只是一种一次性的