(Java)如果用户输入的数据不是整数,如何确保引发异常,并且允许用户提供其他输入?

时间:2018-07-08 10:43:28

标签: java while-loop exception-handling java.util.scanner

我正在制作一个非常基本的战舰游戏。与真实物体不同,该程序会生成三个从0到6的随机整数。然后,玩家必须通过输入整数来猜测飞船的位置。

我是Java的初学者,刚刚简要介绍了抛出异常和try / catch。

因此,该程序现在是:

public class digitBattleShips {

static int choice;
int playerScore;

int shipLoc1;
int shipLoc2;
int shipLoc3;

Random rand = new Random();
static Scanner input = new Scanner(System.in);

public void digitBattleShipsGame() {

    shipLoc1 = rand.nextInt(7);

    shipLoc2 = rand.nextInt(7);

    shipLoc3 = rand.nextInt(7);

    System.out.println(
            "Welcome to digit BattleShips! In this game, you will choose a 
          number from 0 to 6. There are 3 ships to destroy, if you get them 
      all, you win");

    while (playerScore != 3) {

        System.out.println("Choose a number from 0 to 6");

        playerChoice();

        if (choice == shipLoc1 || choice == shipLoc2 || choice == shipLoc3) {
            System.out.println("KABOOOOOOM!");

            playerScore++;
        } else {
            System.out.println("Sploooosh...");
        }



    }

    System.out.println("HURRRAAAAAAY you win");

}

public static void playerChoice() {

    try {
    choice = (int) input.nextInt();

    while (choice<0 || choice>6) {
        System.out.println("Error. You have to choose a number from 0 to 6");
        playerChoice();
    } }

    catch (InputMismatchException ex) {

        System.out.println("Invalid input! You have to enter a number");

        playerChoice();
    }

}

public static void main(String[] args) {

    digitBattleShips digit = new digitBattleShips();

    digit.digitBattleShipsGame();
}

}

此刻,这是发生的事情:

1)如果玩家选择0到6之间的整数,则while循环会按预期工作,并将持续到玩家击中shipLoc1,shipLoc2和shipLoc3代表的三艘船为止。

2)如果播放器选择大于或小于0和6的数字,则会显示错误,并且提示播放器再次输入其他内容。按预期工作。

3)如果玩家选择了字符,字符串,浮点数等,则抛出异常,但不允许玩家再次更改其输入。

我认为创建一个专门设计的方法(在代码中命名为playerChoice())以允许输入进行分类,因此,在引发异常之后,此方法将再次激活,以便玩家可以选择另一个数字。但是,从我有限的理解来看,确实看起来是存储了无效选择,因此,当调用此方法时,由于无效选择始终存在,因此会自动再次引发异常。然后,将创建一个引发异常的无限循环。

想法是,如果前面的输入无效(即不是整数),则允许另一输入,这样3)的操作方式与2)相同

我认为我在这里面临的困惑可能是因为我放置了while和try / catch技术。请提供一些指导以及如何防止3)发生

2 个答案:

答案 0 :(得分:2)

这就是我要做的:

public static void playerChoice()
{
    try
    {
        String inStr = input.nextLine();
        int inInt = Integer.parseInt(inStr); // throws exception.
        if (inInt < 0 || inInt > 6) // If number out of range, try again.
        {
            System.out.println("Error. You have to choose a number from 0 to 6");
            playerChoice();
        }
        else
        {
            choice = inInt;
        }
    }
    catch (NumberFormatException ex) // If exception, try again.
    {
        System.out.println("Invalid input! You have to enter a number");
        playerChoice();
    }
}

我将不再依赖Scanner.nextInt(),而是先将输入读取为String(因为此步骤不涉及解析),然后使用Integer.parseInt()进行手动解析。通常,将读取/获取与转换/解析分开是一个好习惯。

答案 1 :(得分:1)

在进行一些谷歌搜索之后,看起来好像在抛出异常之后并没有清除输入(请参见How does input.nextInt() work exactly?)。

结果,由于您没有调用“ input.next();”,因此它将继续读取相同的输入,意识到它不是整数并抛出异常。

解决方案:

 try {
choice = (int) input.nextInt();

while (choice<0 || choice>6) {
    System.out.println("Error. You have to choose a number from 0 to 6");
    playerChoice();
} }

catch (InputMismatchException ex) {

    System.out.println("Invalid input! You have to enter a number");
    input.next();
    playerChoice();
}