在满足条件之前请求输入并返回此输入的方法

时间:2017-10-27 13:18:29

标签: java exception

我在Java中编写方法有问题,在用户实际键入字母之前要求写信。然后我希望我的方法返回这封信。

因此,如果用户输入" 2"我希望我的方法再次要一封信。

我尝试在下面编写代码,但是在循环内部创建了字母,所以我无法将其返回到循环之外。

public String askForLetter() {
    Scanner in = new Scanner(System.in);
    int flag = 1;
    do {
        System.out.println("Type a letter");
        String letter = in.next();
        if (isLetter(letter)) {
            flag = 2;
            return letter;
        } else
            throw new IllegalArgumentException("Illegal argument, try again");
    } while (flag == 1)
    return letter;
}

如何处理这类问题?

2 个答案:

答案 0 :(得分:1)

这里有几个问题,但幸运的是,它们都很容易解决。

首先,您希望循环继续,直到您获得有效输入。抛出异常是继续正常执行路径的好方法,所以nix异常抛出;这里不需要它。

你也不需要在循环中return letter。它实际上并没有伤害任何东西,但确实使外部return变得多余。因此,为了便于阅读和设计,最好将其删除。

最后,关于变量在循环内定义这一事实的主要问题是处理一个称为变量范围的问题。变量的范围(大致)是它所属的最小支撑封闭块。因此,如果您希望在循环外部访问它,请在循环外部声明它并为其分配默认值。

public String askForLetter() {
    Scanner in = new Scanner(System.in);
    int flag = 1;
    String letter = "";
    do {
        System.out.println("Type a letter");
        letter = in.next();
        if (isLetter(letter)) {
            flag = 2;
        }
    } while (flag == 1)
    return letter;
}

答案 1 :(得分:0)

我希望我不会迟到,但我可以提出更简单的答案吗?它与西尔维奥的方法相同,但我在中间取出了不必要的支票。

public String askForLetter() {
    Scanner in = new Scanner(System.in);
    String letter = null;

    do {
        System.out.println("Type a letter");
        letter = in.next();
    } while(!isLetter(letter));     // perform the check for the letter here

    in.close();                     // close the Scanner since we hate warnings
    return letter;
}

由于我们已经在do-while中有条件,我们可以简单地检查字母本身,而不是更改标志的状态。此外,正如西尔维奥所说,我们希望这一点尽可能简单和可读。