Java - Matcher在访问组后抛出IllegalStateException

时间:2015-06-01 18:57:18

标签: java regex

我试图为我的项目编写简单的命令解析器类。这就是我所拥有的:

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,所以应该是一个正确的组索引,java在这种情况下抛出IllegalStateException?另外,为什么没有找到模式?

2 个答案:

答案 0 :(得分:2)

您需要使用:

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

即。在find方法之前致电matchesgroup()

答案 1 :(得分:2)

您必须在m.find()之前致电m.group()

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