[英]Exception Handling a switch method
我正在尝试获取一个程序,要求某人输入1到13之间的数字,以便他们进行选择。 我正在尝试弄清楚如果他们想相反地输入一个无效数字或字符或字符串,该如何处理。 到目前为止,这就是我所拥有的...
try {
attackingUnit = selectUnit(input.nextInt());
attackerUnitName = attackingUnit.getUnitName();
} catch (NullPointerException e) {
System.out.println("Invalid option, please pick a valid option\n");
showUnitSelection();
attackingUnit = selectUnit(input.nextInt());
attackerUnitName = attackingUnit.getUnitName();
}
这是我用于进行选择本身的方法:
private static Unit selectUnit(int selection) {
switch (selection) {
case 1:
return Unit.GreatSwords;
case 2:
return Unit.BlackOrcs;
case 3:
return Unit.Bestigor;
case 4:
return Unit.ChaosChosen;
case 5:
return Unit.MenAtArms;
case 6:
return Unit.Executioners;
case 7:
return Unit.GraveGuard;
case 8:
return Unit.Retributors;
case 9:
return Unit.StormVermin;
case 10:
return Unit.SwordMasters;
case 11:
return Unit.TombGuard;
case 12:
return Unit.WildWoodRangers;
case 13:
return Unit.Hammerers;
}
return null;
}
如果您不介意,我很想确定我的建议不正确。
我认为如果您采用这种方式,代码看起来会更漂亮:
public enum Unit{
GreatSwords(1),
BlackOrcs(2),
Bestigor(3),
ChaosChosen(4),
MenAtArms(5),
Executioners(6),
GraveGuard(7),
Retributors(8),
StormVermin(9),
SwordMasters(10),
TombGuard(11),
WildWoodRangers(12),
Hammerers(13)
private int index;
public int getIndex() {
return this.index;
}
public static getUnitByIndex(int index) throws IllegalArgumentException {
return Stream.of(values())
.filter(unit -> unit.getIndex() == index)
.findFirst()
.orElseThrow(() -> new IllegalArgumentException("Invalid value");
}
}
这里的想法是避免空值,因此最好的选择是使默认情况下,如果switch语句不匹配任何内容,则返回Unit.Unknown
。 然后,您可以检查输入是否等于Unit.Unknown
以及是否确实告诉用户该输入无效。
为此,首先将一个“未知”成员添加到Unit枚举中。
然后在默认情况下将以下内容添加到您的switch语句中:
default:
return Unit.Unknown;
然后在原始代码中将其更改为:
attackingUnit = selectUnit(input.nextInt());
attackerUnitName = attackingUnit.getUnitName();
//check if its valid
if(attackerUnitName==Unit.Unknown){
//unit is unknown ,tell the user the input was invalid
} else {
//input was valid, do what you want to do
}
您的切换代码将与默认情况下一样-
private static Unit selectUnit(int selection) {
switch (selection) {
case 1:
return Unit.GreatSwords;
case 2:
return Unit.BlackOrcs;
case 3:
return Unit.Bestigor;
case 4:
return Unit.ChaosChosen;
case 5:
return Unit.MenAtArms;
case 6:
return Unit.Executioners;
case 7:
return Unit.GraveGuard;
case 8:
return Unit.Retributors;
case 9:
return Unit.StormVermin;
case 10:
return Unit.SwordMasters;
case 11:
return Unit.TombGuard;
case 12:
return Unit.WildWoodRangers;
case 13:
return Unit.Hammerers;
default:throw new IllegalArgumentException(""Invalid option, please pick a valid option\n");
}
}
您的处理代码将是-
try {
attackingUnit = selectUnit(input.nextInt());
attackerUnitName = attackingUnit.getUnitName();
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage);
showUnitSelection();
attackingUnit = selectUnit(input.nextInt());
attackerUnitName = attackingUnit.getUnitName();
}
尝试这个。 使用异常处理进行简单验证是一项昂贵的操作,尽管它可以很好地工作。
attackingUnit = null;
while(attackingUnit == null){
System.out.println("Invalid option, please pick a valid option\n");
showUnitSelection();
attackingUnit = selectUnit(input.nextInt());
}
attackerUnitName = attackingUnit.getUnitName();
更新:修改您的方法以包括默认大小写(根据@SteelToe建议)
private static Unit selectUnit(int selection) {
switch (selection) {
case 1:
return Unit.GreatSwords;
case 2:
return Unit.BlackOrcs;
case 3:
return Unit.Bestigor;
case 4:
return Unit.ChaosChosen;
case 5:
return Unit.MenAtArms;
case 6:
return Unit.Executioners;
case 7:
return Unit.GraveGuard;
case 8:
return Unit.Retributors;
case 9:
return Unit.StormVermin;
case 10:
return Unit.SwordMasters;
case 11:
return Unit.TombGuard;
case 12:
return Unit.WildWoodRangers;
case 13:
return Unit.Hammerers;
default:
return Unit.Unknown;
}
}
并执行以下操作:
attackingUnit = Unit.Unknown;
while(attackingUnit == Unit.Unknown){
System.out.println("Invalid option, please pick a valid option\n");
showUnitSelection();
attackingUnit = selectUnit(input.nextInt());
}
attackerUnitName = attackingUnit.getUnitName();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.