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

Java 为什么Matcher.group()抛出非法状态异常?,java,regex,pattern-matching,matcher,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(

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

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);
        }
    }
}
但是

抛出非法语法异常

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

 java.lang.IllegalStateException: No match found
我缺少什么?

如果加载==false,则不会执行reg.resetline.matches,因为!加载已为真。在第一个示例中,再次检查是否存在匹配项,然后才尝试获取组。在第二个示例中,您只是假设存在匹配,因为您到达了那里,这可能不是真的


如果你发布的代码就是你在这个If语句中所做的全部,那么你可以去掉这个!加载检查,因为不管它是真是假-一旦找到匹配项,就会在正文中执行代码,如果找不到匹配项,则不会执行该代码。

错误说明一切:-找不到匹配项!加载为true,因此甚至不会执行reg.resetline.matches。加载的值是多少?布尔加载为false,但您仍在尝试通过reg.group1获取匹配。在第一个代码示例中,您有一个检查是否存在匹配的if语句,在第二个代码示例中,您删除了该if语句。@user6188402不正确。该模式精确定义了有多少组可用。实际匹配可能会使其中许多为空,但它们仍然存在。此外,如果该组不存在,您将获得IndexOutOfBoundsException,而不是IllegalStateException。
 java.lang.IllegalStateException: No match found