我正在嘗試爲我的項目編寫簡單的命令解析器類。下面是我有: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,這怎麼可能?另外,爲什麼沒有發現模式?
但是,這提出了一個問題,爲什麼沒有找到該模式,即使「測試」應該是在組1 – qiubit
@qiubit因爲沒有打電話找' ()'它還沒有搜索它。 – dognose
是的,你必須調用'find()'或'matches()',但你爲什麼還在調用'groupCount()'?它顯然不會傷害任何東西,但它毫無意義。 –