如何捕获一个值并告诉用户再次输入?

How to catch a value and tell the user to input again?

我正在尝试创建一个游戏角色,并要求用户输入一个介于 0-18 之间的数字。我输入 19 以查看代码是否会告诉我再试一次,但它只是忽略它然后打印出该字符。它也对魔法数量做同样的事情。用户应输入 0 到 50 之间的数字,但如果我输入大于 50 的数字,它仍会打印出来。我希望代码告诉我输入错误并重试。有没有一种方法可以要求用户在不使用异常的情况下重试?

public class Character {

    private String name;
    private int strength;

    public Character() {
        name = "TBD";
        strength = 15;
    }

    public Character(String name, int strength) {
        this.name = name;
        this.strength = strength;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;   
    }

    public int getStrength() {
        return strength;
    }

    public void setStrength(int strength) {
        int count = 1;
        while (true) { 
            if (strength >= 0 && strength <= 18) {
                System.out.println("Value is out of range 0-18");
                System.out.println("Please try again");
                break;
            }
            else {
                this.strength = strength;
                count = 0;
            }
        }
    }

    public String toString() {
        return "Name: " + name + ", Strength: " + strength;
    }
}
public class Human extends Character {

    private String name;
    private int strength;
    private String weapon;
    private int magicAmount;

    public Human(String name, int strength, String weapon, int magicAmount) {
        this.name = name;
        this.strength = strength;
        this.weapon = weapon;
        this.magicAmount = magicAmount;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getStrength() {
        return strength;
    }

    public void setStrength(int strength) {
        this.strength = strength;
    }

    public String getWeapon() {
        return weapon;
    }

    public void setWeapon(String weapon) {
        this.weapon = weapon;
    }

    public int getMagicAmount() {
        return magicAmount;
    }

    public void setMagicAmount(int magicAmount) {
        int count = 1;
        while (count != 0) {
            if ((magicAmount >= 0 && magicAmount <= 50)) {
                System.out.println("Value is out of range 0-50");
                System.out.println("Please try again");
                break;
            }
            else {
                this.magicAmount = magicAmount;
                count = 0;
            }           
        }
    }

    public String toString() {
        return "Human [Name: " + name + ", Strength: " + strength + ", Weapon: " 
                + weapon + ", Magic Amount: " + magicAmount + "]";
    }
}

    ArrayList<Character> characters = new ArrayList<Character>();

    String keepLooping = "y";

    do {
        System.out.println("Which character would you like to create (Human, Robot, or Animal): ");
        String choice = input.nextLine();

        if (choice.equalsIgnoreCase("Human")) {

            System.out.println("Enter a name for the Human: ");
            String name = input.next();

            System.out.println("Enter the amount of stength for Human (0-18): ");
            int strength = input.nextInt();

            input.nextLine();
            System.out.println("Enter a weapon for Human (Sword or Dagger): ");
            String weapon = input.nextLine();

            System.out.println("Enter the magic amount for your selected weapon (0-50): ");
            int magicAmount = input.nextInt();

            Human charH = new Human(name, strength, weapon, magicAmount);
            characters.add(charH);
        }

        input.nextLine();
        System.out.println("Would you like to create more characters - y or n");
        keepLooping = input.nextLine();
    }

    while (keepLooping.equalsIgnoreCase("y"));

    for (int i = 0; i < characters.size(); i++) {
        Character c = characters.get(i);
        System.out.println(c);
    }
}

您应该对用户输入进行验证,例如 (strength):

Integer strength = null;
while (strength == null) {
    System.out.println("Enter the amount of stength for Human (0-18): ");
    strength = input.nextInt();

    if (strength < 0 || strength > 18) {
        strength = null;
        System.out.println("Invalid strength, please try again");
    }
}

另一个问题是您在 setStrength 中进行了验证登录,但从未调用过,因为您在构造函数中设置了强度。所以解决方法是:

public Character(String name, int strength) {
    setName(name);
    setStrength(strength);
}

您的代码在创建人类方面存在几个问题。

问题 1

第一个问题是您使用全参数构造函数创建 Human。这样 setStrength(...) 和 setMagicAmount(...) 永远不会被调用。

解决方案 1

利用二传手。请注意,这仍然不起作用。参见问题 2 和 3。

public Human(String name, int strength, String weapon, int magicAmount) {
    this.name = name;
    //this.strength = strength;
    setStrength(strength); // not this will still not work! Problem 2 and 3
    this.weapon = weapon;
    //this.magicAmount = magicAmount;
    setMagicAmount(magicAmount); // Will still not work. See Problem 3
}

解决方案 2

您可以使用无参数构造函数,然后调用设置器,而不是使用全参数构造函数。还是不行。 Se 问题 2 和 3.

Human human = new Human();
human.setName(name);
human.setStrength(strength); // will not work. See problem 2 and 3
human.setWeapon(weapon);
human.setMagicAmount(magicAmount); // will not work. See problem 3

问题2

Class Human extends Character 但你仍然覆盖了 human 中的 setStrength(...) 方法。此方法没有任何规则。

删除Human中的这个方法,因为它是继承的,所以将调用具有规则的Character中正确的setStrength(...)。这仍然行不通。参见问题 4.

问题3

您在 setStrength(...) 和 setMagicAmount(...) 中设置了范围检查规则。问题是这两种方法的范围检查都是错误的,你不需要循环。

解决方案

首先检查值。如果超出范围告诉用户,否则设置值。

对于 setStrength(...) 更改为

public void setStrength(int strength) {
    if (strength < 0 || strength > 18) { // less than 0 or more than 18
        throw new IllegalArgumentException("Value is out of range 0-18");
    }
    this.strength = strength;
} 

对于 setMagicAmount(...) 更改为

public void setMagicAmount(int magicAmount) {
    if (magicAmount < 0 || magicAmount > 50) { // less than 0 or more than 50
        throw new IllegalArgumentException("Value is out of range 0-50");
    }
    this.magicAmount = magicAmount;
}