Matcher бросает IllegalStateException после матчей - PullRequest
7 голосов
/ 05 марта 2011

У меня странные проблемы с матчами, в надежде, что кто-то сможет пролить свет.
Согласно документации Java:

публичные логические совпадения () ... Если Матч успешен, тогда больше информации можно получить через начало, конец, и групповые методы.

Код:

private static Hashtable<String,String> splitAddress(String address){
        Hashtable<String,String> result = new Hashtable<String,String>();

        Matcher m = addrLong.matcher(address);
        if (m.matches()) {
            result.put("number", m.group(1));

Вот куда он бросает:

java.lang.IllegalStateException: No match found
    java.util.regex.Matcher.group(Matcher.java:485)
    splitAddress(WebServiceHelper.java:699)

Это одно странно для меня. Вот еще немного информации, если это поможет:

    private static final String numberRegex = "[0-9]*[a-zA-Z]?"; // 123a 123
    private static final String compassRegex = "N|E|S|W|NORTH|EAST|SOUTH|WEST|NORD|EST|SUD|OUEST";
    private static final String typeRegex = "STREET|ST|DRIVE|DR|AVENUE|AVE|AV|ROAD|RD|LOOP|LP|COURT|CT|CIRCLE|LANE|LN|BOULEVARD|BLVD|CRESCENT|CR";

addrLong = Pattern.compile("(" + numberRegex + ")\\s(.*)\\s(" + typeRegex + ")\\s?(" + compassRegex + ")?");

Входная строка, с которой я проверял, - "12 CLARE ST E"

Спасибо!

Редактировать: Ой, я вставил свое объявление addrShort вместо моего addrLong

Edit2: я знаю, что соглашения об именах нарушаются. Я не писал эту часть, клянусь.

UPDATE:

Это успешно выполняется как отдельная функция.

Есть идеи, почему это может сломаться в среде котов?

Я посмотрю, смогу ли я найти что-нибудь, что может повлиять на это, но мой addrLong - моя единственная статическая переменная и больше нигде не используется.

Это сводит меня с ума. Я даже попробовал:

    Pattern p = Pattern.compile("(" + numberRegex + ")\\s(.*)");
    Matcher m = p.matcher(address);

    if (m.matches()) {
        result.put("number", m.group(1));

в моей серверной среде, и она не работает.

ОБНОВЛЕНИЕ 2

Он даже работает нормально, когда он один в сервлете. Я в тупике. Любые советы или идеи с благодарностью.

ОБНОВЛЕНИЕ 3

Винт, я просто перемещаю функцию в другой класс. Спасибо за вашу помощь @ mjg123, поставьте заслуженную галочку.

Это будет беспокоить меня вечно ...

1 Ответ

3 голосов
/ 05 марта 2011

Я скопировал и вставил ваш код, и он компилируется и запускается, как и ожидалось, без исключений.Есть ли какая-то другая часть вашего кода, вызывающая это?


Мой полный код:

public class StackOverflow {

    private static final String numberRegex = "[0-9]*[a-zA-Z]?"; // 123a 123
    private static final String compassRegex = "N|E|S|W|NORTH|EAST|SOUTH|WEST|NORD|EST|SUD|OUEST";
    private static final String typeRegex = "STREET|ST|DRIVE|DR|AVENUE|AVE|AV|ROAD|RD|LOOP|LP|COURT|CT|CIRCLE|LANE|LN|BOULEVARD|BLVD|CRESCENT|CR";
    private static final Pattern addrLong = Pattern.compile("(" + numberRegex + ")\\s(.*)\\s(" + typeRegex + ")\\s?(" + compassRegex + ")?");

    public static void main(final String[] args) {
        final String address = "12 CLARE ST E";
        final Hashtable<String, String> result = splitAddress(address);
        System.out.println(result.get("number"));
    }

    private static Hashtable<String, String> splitAddress(final String address) {
        final Hashtable<String, String> result = new Hashtable<String, String>();

        final Matcher m = addrLong.matcher(address);
        if (m.matches()) {
            result.put("number", m.group(1));
        }
        return result;
    }
}

, который работает нормально и печатает 12 в качестве вывода.

...