字符串验证问题:
这种方法大部分都有效,但有一些明显的逻辑问题。如果用户在没有输入的情况下点击控制台进入,它应该返回“错误!此条目需要”消息,但它没有。我会想象它会,因为我正在测试输入 一个或多个字符
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");
}
}
答案 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将产生该值,它将匹配您输入的整行,即使它是一个空行。