2016-05-26 2 views
-1

Почему ниже код работает прекрасныйПочему Matcher.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); 
     } 
    } 
} 

но

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

бросает IllegalSyntaxException?

Я был удивлен, потому что я уже вызываю совпадения в условии if. Ожидается, что он возвращает строку, соответствующую группе, вместо этого выдает исключение.

java.lang.IllegalStateException: No match found 

Что мне не хватает?

+3

ошибка говорит все: - _No match found_ – rock321987

+2

Похоже, что '! Loading' истинно, поэтому' reg.reset (line) .matches() 'даже не будет выполнен. – Pshemo

+0

Какова ценность 'loading'? –

ответ

2

Если loading == false, reg.reset(line).matches() не будет выполнено, поскольку !loading уже есть true. В первом примере вы «снова» проверяете, есть ли совпадение, и только затем попытайтесь получить группу. Во втором примере вы просто предполагаете, что есть совпадение, потому что вы попали туда, что может быть неверным.

Если код, который вы отправили, - это все, что вы делаете в этом if -стате, вы можете избавиться от проверки !loading, так как это не имеет значения, если это правда или ложно - как только вы найдете совпадение, ll выполнить код внутри тела, если вы не можете найти совпадение, он не будет выполнен.