我正在尝试使用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)
输入的值应该是用户在控制台中输入的值。正则表达式应与输入匹配,以验证它是否符合正则表达式要求。
答案 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!");
}