2016-05-26 18 views
-1

Warum den Code unten funktionierenWarum löst Matcher.group() eine unzulässige Ausnahme aus?

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

aber

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

wirft IllegalSyntaxException?

Ich war überrascht, weil ich bereits Matches in der if-Bedingung aufruft. Es wird erwartet, dass die Zeichenfolge zurückgegeben wird, die der Gruppe entspricht. Stattdessen wird die Ausnahme ausgelöst.

java.lang.IllegalStateException: No match found 

Was fehlt mir?

+3

Der Fehler sagt alles: - _Keine Übereinstimmung gefunden_ – rock321987

+2

Sieht aus wie '! Loading' ist wahr, so' reg.reset (line) .matches() 'wird nicht einmal ausgeführt werden. – Pshemo

+0

Was ist der Wert von 'loading'? –

Antwort

2

Wenn loading == false, reg.reset(line).matches() nicht ausgeführt werden, weil !loading bereits true ist. In Ihrem ersten Beispiel überprüfen Sie dann "nochmal", ob es eine Übereinstimmung gibt und versuchen dann erst, die Gruppe zu bekommen. In Ihrem zweiten Beispiel nehmen Sie einfach an, dass es eine Übereinstimmung gibt, weil Sie dort angekommen sind, was möglicherweise nicht wahr ist.

Wenn der Code, den Sie gepostet haben, alles ist, was Sie in dieser if -Anweisung tun, können Sie die !loading Überprüfung loswerden, da es keine Rolle spielt, ob es wahr oder falsch ist - sobald Sie eine Übereinstimmung finden, Sie ' ll führen den Code innerhalb des Körpers aus, wenn Sie keine Übereinstimmung finden, wird es nicht ausgeführt.