验证Java中的字符串返回不正确。测试扫描仪的字符串长度?

时间:2014-04-06 17:05:42

标签: java

字符串验证问题:

这种方法大部分都有效,但有一些明显的逻辑问题。如果用户在没有输入的情况下点击控制台进入,它应该返回“错误!此条目需要”消息,但它没有。我会想象它会,因为我正在测试输入 一个或多个字符

public String getChoiceString(String prompt, String s1, String s2) {
    this.println(prompt);
    String userChoice = this.sc.next();
    String i;
    boolean isValid = false;
    while (isValid == false)
    {
        if (userChoice.equalsIgnoreCase(s1) || userChoice.equalsIgnoreCase(s2))
        {
            isValid = true;
        }
        else if (userChoice.length() <= 1 || userChoice.equalsIgnoreCase("")) {
            System.out.println("Error! This entry is required. Try again.");
            userChoice = this.sc.next();
        }
        else {
            this.println("Error! Entry must be " + s1 + " or " + s2 + ". Try again.");
            userChoice = this.sc.next();
        }

    }
    return userChoice;

从这里我创建了一个包含此方法的类的实例。它被称为控制台。我从这里调用方法:

public class ConsoleTestApp {    
    public static void main(String[] args) {
        System.out.println("Welcome to the Console Tester application");
        System.out.println();

        //get console object
        Console console = IOFactory.getConsoleIO();
        console.println("Int Test");
        console.getIntWithinRange("Enter an integer between -100 and 100: ", -100, 100);
        console.println();
        console.println("Double Test");
        console.getDoubleWithinRange("Enter any number between -100 and 100: ", -100, 100);
        console.println();
        console.println("Required String Test");
        console.getRequiredString("Enter your email address: ");
        console.println();
        console.println("String Choice Test");
        console.getChoiceString("Select one (x/y): ", "x", "y");          
    }    
}

1 个答案:

答案 0 :(得分:1)

当您输入Scanner#next的回车时,似乎没有任何事情发生。 Javadoc要求它仅在带有分隔符的完整标记上匹配。

Scanner的默认分隔符为\p{javaWhitespace}+。实质上,它将整个令牌描述为至少包含一个空白字符。

现在,让我们检查一下空String。它中不包含任何字符。所以,如果我们要与默认的分隔符正则表达式匹配,我们就会失败:

Scanner sc = new Scanner(System.in);
Pattern ptn = sc.delimiter();
System.out.println(ptn);
String empty = "";
String regex = "\\p{javaWhitespace}+";
System.out.println(empty.matches(regex)); // prints false

因此,模式不匹配,Scanner将阻止,直到匹配某些内容,例如A phrase

所以,不是试图处理可能由next()引起的任何头痛,而是你可能想要使用的是nextLine()。在大多数情况下,您希望在要匹配整个输入行时使用nextLine(),而在单行处理多个元素时使用next()

String userChoice = this.sc.nextLine(); // wherever this Scanner instance lives...

这将匹配任何containing a line separator,因为点击return / enter将产生该值,它将匹配您输入的整行,即使它是一个空行。