2015-06-01 68 views
1

我正在嘗試爲我的項目編寫簡單的命令解析器類。下面是我有:Java - Matcher在訪問組後拋出IllegalStateException

Main.java

public static void main(String[] args) { 
    CmdParser p = new CmdParser(args); 
    String st = p.getSourceType(); 
} 

CmdParser.java

import java.util.ArrayList; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
public class CmdParser { 

    private String[] args; 

    public CmdParser(String[] args) { 
     this.args = args; 
    } 

    public String getSourceType() throws ParseException { 
     ArrayList<String> sourceTypes = new ArrayList<String>(); 
     Pattern p = Pattern.compile("--source-type=([^\\s]+)"); 
     for (String s : args) { 
      Matcher m = p.matcher(s); 
      if (m.groupCount() == 1) { 
       sourceTypes.add(m.group(1)); //line 28 
      } 
     } 
     return sourceTypes.get(0); 
    } 
} 

java Main --source-type=test運行這將導致以下的輸出:

Exception in thread "main" java.lang.IllegalStateException: No match found 
    at java.util.regex.Matcher.group(Matcher.java:536) 
    at CmdParser.getSourceType(CmdParser.java:28) 
    at Main.main(Main.java:11) 

我評論線28上方。儘管groupCount爲1,那麼這應該是一個正確的組索引,在這種情況下,拋出IllegalStateException,這怎麼可能?另外,爲什麼沒有發現模式?

回答

2

您需要使用:

if (m.find() && m.groupCount() == 1) { 
    sourceTypes.add(m.group(1)); //line 28 
} 

即致電findmatches之前group()方法。

+0

但是,這提出了一個問題,爲什麼沒有找到該模式,即使「測試」應該是在組1 – qiubit

+3

@qiubit因爲沒有打電話找' ()'它還沒有搜索它。 – dognose

+1

是的,你必須調用'find()'或'matches()',但你爲什麼還在調用'groupCount()'?它顯然不會傷害任何東西,但它毫無意義。 –

2

你必須調用m.find()m.group()

for (String s : args) { 
     Matcher m = p.matcher(s); 
     if (m.find()) { 
      sourceTypes.add(m.group(1)); //line 28 
     } 
    } 
相關問題