Java Regex Matcher遇到NullPointerException,当输入null input

时间:2016-12-22 15:32:10

标签: java nullpointerexception

我正在尝试使用java regex matcher-class,并且在我的代码中遇到NullPointerException:

String input = null;
System.out.println("\nEnter your username: ");
Matcher matcher = VALID_USERNAME_REGEX.matcher(input); //EXCEPTION IS HERE
if (matcher.find()) {
    username = input;
} else {
    input = null;
    System.out.println("\nInvalid input, please try again!");
}

堆栈跟踪:(第173行在上面的代码中,注释" //EXCEPTION IS HERE"位于其中)

Exception in thread "main" java.lang.NullPointerException
    at java.util.regex.Matcher.getTextLength(Unknown Source)
    at java.util.regex.Matcher.reset(Unknown Source)
    at java.util.regex.Matcher.<init>(Unknown Source)
    at java.util.regex.Pattern.matcher(Unknown Source)
    at org.console.Interface.createAccount(Interface.java:173)
    at org.console.Interface.login(Interface.java:78)
    at org.application.Application.run(Application.java:31)
    at org.application.Application.main(Application.java:37)

输入的值应该是用户在控制台中输入的值。正则表达式应与输入匹配,以验证它是否符合正则表达式要求。

2 个答案:

答案 0 :(得分:6)

Pattern#matcher的javadoc中未明确说明,但它不适用于null输入(它会创建一个新的Matcher实例,该实例会自动重置初始化,导致观察到的异常)。您必须事先明确地测试!= null

旁注:虽然没有记录,但它有already been declined to change

  

当前的API文档没有明确或隐含地提及是否   是否应该抛出NPE。但很难定义一个   a&#34; null&#34;的良好语义在Matcher作为法律输入文本,应该   它在语义上等同于空字符串&#34;&#34;?显然不是。   然后,当匹配null时,应该期望匹配/查找结果   反对边界模式,如&#34; ^&#34;和&#34; $&#34; (可能没有匹配/没有找到   对于所有模式),谁将受益于这样的语义?   所描述的使用场景是合理的,但应该很容易实现   通过使用空字符串&#34;&#34;代替。没有看到强有力的理由   &#34;固定&#34;目前的行为。而是将包规范更新为   描述NPE行为可能是一个更好的选择。

答案 1 :(得分:2)

我在匹配线上方添加了input = in.nextLine();

String input = null;
System.out.println("\nEnter your username: ");
input = in.nextLine();
Matcher matcher = VALID_USERNAME_REGEX.matcher(input); //EXCEPTION IS HERE
if (matcher.find()) {
    username = input;
} else {
    input = null;
    System.out.println("\nInvalid input, please try again!");
}