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

Why is Matcher.group() throwing illegal state exception?

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

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 条件下调用了匹配项。期望是它 returns 与组匹配的字符串,而是抛出异常。

 java.lang.IllegalStateException: No match found

我错过了什么?

如果loading == falsereg.reset(line).matches()不会被执行,因为!loading已经是true。在您的第一个示例中,然后 "again" 检查是否存在匹配项,然后才尝试获取该组。在你的第二个例子中,你只是假设有一场比赛因为你到了那里,这可能不是真的。

如果您发布的代码就是您在此 if 语句中所做的全部,您可以去掉 !loading 检查,因为它是真还是假都没有关系 - 因为一旦找到匹配,就会执行正文中的代码,如果找不到匹配,则不会执行。