gpt4 book ai didi

java - 在 Java 中递归捕获异常

转载 作者:行者123 更新时间:2023-12-02 04:56:42 26 4
gpt4 key购买 nike

我目前正在开发一款小游戏,但遇到了一个我自己无法解决的问题。我有一个方法可以读取输入并将其存储在变量中。对于任何错误的输入,都会抛出一个 IllegalArgumentException 异常,您可以在其中再次尝试输入。但如果你再次做错,它只会继续下一个输入类型。但我希望它在输入有效之前要求输入。我的导师告诉我用 try and catch 来做,但正如我所说,它只会做两次然后继续。

代码如下:

 public void readSettings(){
Scanner userinput = new Scanner(System.in);
System.out.println("Wie lange soll der Code sein? (4-10):");
String input = userinput.nextLine();
//Eingabe der Länge des zu lösenden Codes. Bei einer Eingabe außerhab des Wertebereichs wird dies gemeldet und neu gefragt.
try{
if (input.matches("[4-9]|10")) {
this.codelength = Integer.parseInt(input);
}
else {
throw new IllegalArgumentException();
}
}

catch (IllegalArgumentException e) {
System.out.println("Eingabe außerhalb des Wertebreichs!");
//readSettings();
System.out.println("Wie lange soll der Code sein? (4-10):");
input = userinput.nextLine();
if (input.matches("[4-9]|10")) {
this.codelength = Integer.parseInt(input);
}
else {
throw new IllegalArgumentException(e);
}
} finally {

System.out.println("Welche Ziffern sind erlaubt? 0- (1-9):");
input = userinput.nextLine();
//Hier wird die valuerange(Also die Maximale Zahl in der Reihe) abgefragt.
//Auch hier wird eine falche Eingabe abgefangen und der Input neu gestartet. (Leider nicht sehr elegant und benutzerfreundlich.
try {
if (input.matches("[1-9]")) {
this.valuerange = Integer.parseInt(input);
}
else {
throw new IllegalArgumentException();
}
}
catch (IllegalArgumentException f) {
System.out.println("Eingabe außerhalb des Wertebreichs!");
//readSettings();
System.out.println("Welche Ziffern sind erlaubt? 0- (1-9):");
input = userinput.nextLine();
if (input.matches("[1-9]")) {
this.valuerange = Integer.parseInt(input);
}
else {
throw new IllegalArgumentException(f);
}
} finally {

//Falls der Modus nicht Cpmouter gegen Computer ist, wird ein Spielername mit abgefragt.
try {
if(!cpumode) {
System.out.println("Spielername:");
this.spielername = userinput.nextLine();
//Falls kein input bein Namen vorhanden, wird ein Fehler ausgegeben.
if (spielername.length()==0) {
throw new IllegalArgumentException("Fehler, kein Spielername eingegeben!" );

}
}
} catch (IllegalArgumentException e) {
System.out.println("Spielername:");
this.spielername = userinput.nextLine();
if (spielername.length()==0) {
//throw new IllegalArgumentException("Fehler, kein Spielername eingegeben!" );
throw new IllegalArgumentException(e);
}

}
}
}
}

我希望你能帮助我。谢谢!

最佳答案

第一步是意识到您正在重复“阅读代码长度”。这通常意味着两件事:1) 你应该将代码提取到一个方法中并多次调用该方法,或者 2) 你应该使用循环并在循环中编写代码。 (或两者)

循环的建议应该敲响警钟,因为只有那个(或递归...)允许您根据需要重复非固定次数的操作。在伪代码中:

repeat
readNumber
until number is valid

如您所见,条件位于循环的底部。在 Java 中,您将使用 do {...} while(...); - 请注意,您必须从伪代码中反转条件,因为它是 while ,而不是 until

旁注,当您自己抛出异常时,您可以跳过抛出,而是将 codelength 保留为您认为无效的值,例如-1。无论如何你都需要它,因为你必须捕获异常作为 readNumber 部分的一部分,它仍然在你的循环中。

关于java - 在 Java 中递归捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21205768/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com