Java 如何从扫描仪返回有效输入?

Java 如何从扫描仪返回有效输入?,java,regex,Java,Regex,我放弃了。我试图弄清楚为什么我的代码返回第一个(不正确)值 例如: public static String lastName() { System.out.println("Last Name: "); String lastName = input.nextLine(); String dataCheck = "[a-zA-Z]{1,77}"; Pattern pattern = Pattern.compile(dataCheck); Matcher

我放弃了。我试图弄清楚为什么我的代码返回第一个(不正确)值

例如:

public static String lastName() {

    System.out.println("Last Name: ");
    String lastName = input.nextLine();
    String dataCheck = "[a-zA-Z]{1,77}";
    Pattern pattern = Pattern.compile(dataCheck);
    Matcher patternMatcher = pattern.matcher(lastName);

    if(!patternMatcher.matches()){
        do{
            System.out.println("Incorrect input:\n"
                    + "1) Shorten the first name less than 77 characters;\n"
                    + "2) Only alphabet characters are allowed (no numbers or special characters.)\n\n"
                    + "Please enter Last Name: ");
            lastName();

        }
            while (!patternMatcher.matches());

    }
    return lastName;
}
public static void recall(String lastName){
    System.out.println(lastName);
}

如果输入错误,扫描仪会“存储”第一个输入,并且只使用它;如果输入正确,它将继续。到目前为止的研究告诉我放弃正则表达式,只使用input.hasNextLine()。任何帮助都将不胜感激。

您正在进行递归调用,但没有使用结果。。。因此,一旦退出循环,只要更改以下内容,就可以从最顶层的堆栈帧返回
lastName
变量:

lastName();
为此:

return lastName();
那么它可能会起作用。我并不完全清楚,因为我不清楚代码结构

从根本上说,不清楚为什么要同时递归和循环。这对我来说是个坏主意。计算出你在迭代中想要做什么(可能是:显示选项;阅读一行;检查这行),并将所有这些放在循环中。比如(伪代码):


此外,我还将重新讨论您的命名-类似于
getLastName()
readLastName()
的方法比仅
lastName()
更清晰-尤其是当您在方法中有一个名为
lastName
的局部变量时。

它起作用了!我不知道你可以返回一个方法!我肯定有代码要修改。谢谢@user130110:它不是返回方法,而是返回方法调用返回的值。如果这对您来说是新的,我强烈建议您放下正则表达式,在一段时间内多学一点该语言的核心。而且,即使小的修改有效,也不意味着这是最好的方法——请仔细阅读答案的其余部分。@user130110:这绝对是正确的方法——但我认为,在学习该语言的核心部分之前,将正则表达式(相对复杂,带有复杂的API)保留下来是值得的。祝你好运:)
do {
    display-menu
    ask-for-input  
} while (test-to-check-it's-not-valid)