为什么Matcher.group()抛出非法状态异常?

时间:2016-05-26 17:28:07

标签: java regex pattern-matching matcher

为什么下面的代码工作正常

Matcher reg = Pattern.compile("(A|B)\\w{2}(C|D)").matcher("");
while ((line=reader.readLine()) != null)
{
    if (!loading || reg.reset(line).matches()) 
    {
        if (reg.reset(line).matches()) {
            String id = reg.group(1);
        }
    }
}

但是

while ((line=reader.readLine()) != null)
{
    if (!loading || reg.reset(line).matches()) 
    {
            String id = reg.group(1);
    }
}

抛出IllegalSyntaxException?

我很惊讶,因为我已经在if条件下调用了匹配项。期望是它返回与组匹配的字符串,而是抛出异常。

 java.lang.IllegalStateException: No match found

我错过了什么?

1 个答案:

答案 0 :(得分:2)

如果loading == falsereg.reset(line).matches()将无法执行,因为!loading已经是true。在您的第一个示例中,您“再次”检查是否存在匹配,然后尝试获取该组。在你的第二个例子中,你只是假设有一个匹配,因为你到达那里,这可能不是真的。

如果您发布的代码就是您在此if语句中所做的全部内容,那么您可以尽快删除!loading检查,因为它无论是真还是假都无关紧要你找到了一个匹配项,你将在正文中执行代码,如果你找不到匹配项,它就不会被执行。