输入枚举以切换语句结果
Input of enums to switch statment outcomes
所以在这里我要求用户输入命中、停止、投降或退出。我将这些作为枚举,以及 NOTVALID。
enum Decisions
{
HIT, STAND, SURRENDER, QUIT, PLAY, NOTVALID;
// NOTVALID is used to re-ask to play again
}
因此,如果用户输入 "blah" 而不是有效选项之一,我希望它认为它是 NOTVALID 并执行 switch 语句中用于 NOTVALID 的代码。我怎样才能做到这一点?实际上,当我 运行 程序时 returns 错误:
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant BlackJack.Decisions.BLAH
我可以做些什么来使任何不是其他枚举之一的东西成为 NOTVALID?
System.out.println("Do you want to hit, stand, surrender, or quit?");
String decisionInput;
decisionInput = keyboard.nextLine().toUpperCase();
decision = Decisions.valueOf(decisionInput);
switch (decision)
{
case HIT:
Random playerCard = new Random();
cardPick = playerCard.nextInt(13);
playerSum = playerSum + getCardValue(cardPick);
System.out.println("Card: " + (Card.values()[cardPick]) + ". The sum of your hand is: " + playerSum + ".");
System.out.println("The hole card was " + (Card.values()[cardPick2]) + ". The house has: " + houseSum + ".");
findWinner(playerSum, houseSum, decision);
System.out.println("Do you want to play again? Type PLAY or QUIT.");
decision = Decisions.valueOf(keyboard.nextLine().toUpperCase());
break;
case STAND:
case SURRENDER:
findWinner(playerSum, houseSum, decision);
System.out.println("Do you want to play again? Type PLAY or QUIT.");
decision = Decisions.valueOf(keyboard.nextLine().toUpperCase());
break;
case QUIT:
System.out.println("Thanks for playing!");
System.exit(0);
break;
case NOTVALID:
System.out.println("Invalid input. Try again: hit, stand, surrender, or quit?");
decision = Decisions.valueOf(keyboard.nextLine().toUpperCase());
}
}
}
}
定义一个新方法,returns NOTVALID
用于无法识别的输入。最简洁的方法是捕获正在抛出的 IllegalArgumentException。
enum Decisions{
HIT, STAND, SURRENDER, QUIT, PLAY, NOTVALID;
public static Decisions asDecision(String input) {
try {
return Decisions.valueOf(input);
} catch(IllegalArgumentException e) {
return Decisions.NOTVALID;
}
}
}
如果这冒犯了您使用 try..catch
的敏感性,您可以自己手动完成。
enum Decisions{
HIT, STAND, SURRENDER, QUIT, PLAY, NOTVALID;
public static Decisions asDecision(String input) {
for(Decisions d : values()) {
if(d.name().toLowerCase().equals(input.toLowerCase()) {
return d;
}
}
return Decisions.NOTVALID;
}
}
无论如何,请改用新方法。
在不允许定义新方法的情况下,您可以将您的作业包围在 try..catch
中,例如:
String decisionInput;
decisionInput = keyboard.nextLine().toUpperCase();
try{
decision = Decisions.valueOf(decisionInput);
} catch(IllegalArgumentException e){
decision = Decisions.NOTVALID;
}
// Rest of your code...
您可以使用 default:
而不是 NOTVALID。它类似于 else
,在其他情况下,它将默认为该逻辑。
default:
System.out.println("Invalid input. Try again: hit, stand, surrender, or quit?");
decision = Decisions.valueOf(keyboard.nextLine().toUpperCase());
所以在这里我要求用户输入命中、停止、投降或退出。我将这些作为枚举,以及 NOTVALID。
enum Decisions
{
HIT, STAND, SURRENDER, QUIT, PLAY, NOTVALID;
// NOTVALID is used to re-ask to play again
}
因此,如果用户输入 "blah" 而不是有效选项之一,我希望它认为它是 NOTVALID 并执行 switch 语句中用于 NOTVALID 的代码。我怎样才能做到这一点?实际上,当我 运行 程序时 returns 错误:
Exception in thread "main" java.lang.IllegalArgumentException: No enum constant BlackJack.Decisions.BLAH
我可以做些什么来使任何不是其他枚举之一的东西成为 NOTVALID?
System.out.println("Do you want to hit, stand, surrender, or quit?");
String decisionInput;
decisionInput = keyboard.nextLine().toUpperCase();
decision = Decisions.valueOf(decisionInput);
switch (decision)
{
case HIT:
Random playerCard = new Random();
cardPick = playerCard.nextInt(13);
playerSum = playerSum + getCardValue(cardPick);
System.out.println("Card: " + (Card.values()[cardPick]) + ". The sum of your hand is: " + playerSum + ".");
System.out.println("The hole card was " + (Card.values()[cardPick2]) + ". The house has: " + houseSum + ".");
findWinner(playerSum, houseSum, decision);
System.out.println("Do you want to play again? Type PLAY or QUIT.");
decision = Decisions.valueOf(keyboard.nextLine().toUpperCase());
break;
case STAND:
case SURRENDER:
findWinner(playerSum, houseSum, decision);
System.out.println("Do you want to play again? Type PLAY or QUIT.");
decision = Decisions.valueOf(keyboard.nextLine().toUpperCase());
break;
case QUIT:
System.out.println("Thanks for playing!");
System.exit(0);
break;
case NOTVALID:
System.out.println("Invalid input. Try again: hit, stand, surrender, or quit?");
decision = Decisions.valueOf(keyboard.nextLine().toUpperCase());
}
}
}
}
定义一个新方法,returns NOTVALID
用于无法识别的输入。最简洁的方法是捕获正在抛出的 IllegalArgumentException。
enum Decisions{
HIT, STAND, SURRENDER, QUIT, PLAY, NOTVALID;
public static Decisions asDecision(String input) {
try {
return Decisions.valueOf(input);
} catch(IllegalArgumentException e) {
return Decisions.NOTVALID;
}
}
}
如果这冒犯了您使用 try..catch
的敏感性,您可以自己手动完成。
enum Decisions{
HIT, STAND, SURRENDER, QUIT, PLAY, NOTVALID;
public static Decisions asDecision(String input) {
for(Decisions d : values()) {
if(d.name().toLowerCase().equals(input.toLowerCase()) {
return d;
}
}
return Decisions.NOTVALID;
}
}
无论如何,请改用新方法。
在不允许定义新方法的情况下,您可以将您的作业包围在 try..catch
中,例如:
String decisionInput;
decisionInput = keyboard.nextLine().toUpperCase();
try{
decision = Decisions.valueOf(decisionInput);
} catch(IllegalArgumentException e){
decision = Decisions.NOTVALID;
}
// Rest of your code...
您可以使用 default:
而不是 NOTVALID。它类似于 else
,在其他情况下,它将默认为该逻辑。
default:
System.out.println("Invalid input. Try again: hit, stand, surrender, or quit?");
decision = Decisions.valueOf(keyboard.nextLine().toUpperCase());