我是一个初学者,我已经完成了基本的Nim游戏。现在我想应用 try catch
块到程序中,以确保流程控制的完美。不过,我目前看到的资源是在主方法中捕捉异常,所有创建的方法必须在 try
块来捕获异常。
在我的例子中,我创建了我的类的构造函数来调用了 processCommands
面板。然后,这个面板调用类中的其他方法。
我需要捕捉用户的输入 commands
在面板上查看命令是否有效。
我已经试过了。https:/beginnersbook.com201304用户定义的异常在java中。
但是我好像要重新构建我目前所建立的方法。有什么办法可以解决这个问题吗?
任何帮助都是感激的。谢谢你的善意和耐心。
以下是我的部分内容 Nimsys
:
import java.util.ArrayList;
import java.util.Scanner;
class InvalidUserInput extends Exception {
public InvalidUserInput(String s) {
super(s);
}
}
public class Nimsys{
private NimModel nimModel;
public static void main(String[] args) throws InvalidUserInput {
Nimsys nimsys = new Nimsys();
nimsys.processCommands();
}
public Scanner in = new Scanner(System.in);
private void processCommands() {
this.nimModel = new NimModel();
System.out.println("Welcome to Nim\n");
while (true) {
System.out.print('$');
String [] commandin = in.nextLine().split(" ");
if (commandin[0].equalsIgnoreCase("addplayer")) {
addPlayer(commandin[1]);
}
if (commandin[0].equalsIgnoreCase("removeplayer")) {
if (commandin.length > 1) {
removePlayer(commandin[1]);
} else {
removePlayer("");
}
}
if (commandin[0].equalsIgnoreCase("editplayer")) {
editPlayer(commandin[1]);
}
if (commandin[0].equalsIgnoreCase("displayplayer")) {
if (commandin.length > 1 ){
displayPlayer(commandin[1]);
} else {
displayPlayer("");
}
}
if (commandin[0].equalsIgnoreCase("startgame")) {
startGame(commandin[1]);
}
if (commandin[0].equalsIgnoreCase("resetstats")) {
if (commandin.length > 1 ){
resetStats(commandin[1]);
} else {
resetStats("");
}
}
if (commandin[0].equalsIgnoreCase("rankings")) {
if (commandin.length > 1 && commandin[1].equals("asc")) {
rankings(commandin[1]);
}
else if (commandin.length > 1 && commandin[1].equals("desc")) {
rankings(commandin[1]);
} else {
rankings("");
}
}
if (commandin[0].equalsIgnoreCase("exit")) {
if (commandin.length == 1) {
System.out.println("");
break;
}
}
}
}
void userCommandCheck(String [] command) throws InvalidUserInput {
if (command.length >2) {
throw new InvalidUserInput("Incorrect number of arguments supplied to command.");
}
String [] commandSet = {"addplayer", "removeplayer", "editplayer", "displayplayer", "startgame", "resetstats", "rankings"};
for(String commandCell: commandSet) {
if (command[0] != commandCell) {
throw new InvalidUserInput("`"+command[0]+"'" + " is not a valid command.");
}
}
}
}
private void processCommands() {
this.nimModel = new NimModel();
System.out.println("Welcome to Nim\n");
while (true) {
System.out.print('$');
String [] commandin = in.nextLine().split(" ");
try {
switch (userCommandCheck(commandin[0])) {
case "addplayer":
addPlayer(commandin[1]);
default:
}
} catch (InvalidUserInput e) {
}
}
static String userCommandCheck(String command) throws InvalidUserInput {
String [] commandSet = {"addplayer", "removeplayer", "editplayer", "displayplayer", "startgame", "resetstats", "rankings"};
for(String commandCell: commandSet) {
if (command.equalsIgnoreCase(commandCell)) {
return command.toLowerCase();
}
}
throw new InvalidUserInput("`"+command+"'" + " is not a valid command.");
}
}
最后,我这样做。我认为是更清晰的,因为我希望命令面板看起来很干净。
class InvalidUserInput extends Exception {}
Main class {
private void processCommands() {
// commands inside
// try catch block
try {
String [] commandSet = {"addplayer", "addaiplayer", "removeplayer", "editplayer", "displayplayer", "startgame", "resetstats", "rankings"};
boolean contains = Arrays.stream(commandSet).anyMatch(commandin[0]::equals); //check if commandin[0] in any of values in the commandSet
if (!contains) {
throw new InvalidUserInput();
}
} catch (Exception e) {
System.out.println("`"+commandin[0]+"`" + " is not a valid command.");
}
}