2011-03-04 88 views
7

我遇到了一些與Matches有關的奇怪問題,希望有人可以說出一些看法。
根據Java文檔:Matcher在匹配後拋出IllegalStateException

公共布爾匹配()...如果 匹配成功則可以通過起點,終點, 和組的方法來獲得更多的信息 。

一些代碼:

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克萊爾ST E」

謝謝!

編輯:哎呀,我貼我的addrShort聲明,而不是我addrLong

EDIT2:我知道命名規則正在被打破。我沒有寫那部分,我發誓。

UPDATE:

這成功執行,作爲一個獨立的功能。

任何想法爲什麼它會在tomcat環境中打破?

我會看看我是否可以找到任何可能影響這個的東西,但是我的addrLong是我唯一的靜態變量,不會在其他地方使用。

這讓我瘋狂。我甚至嘗試過:

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

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

在我的服務器環境中,它失敗。

更新2

它甚至運行正常時,它獨自在一個servlet。我很難過。任何提示或想法非常讚賞。

更新3

螺絲它,我只是移動的功能出來到另一個類。感謝您的幫助@ mjg123,有一個當之無愧的複選標記。

這將永遠打擾我......

+0

我也一樣。當我調試並逐步完成工作。當我運行它時,它不會。如果(matcher.matches()&& matcher.groupCount()> 0) 可以使其工作 – 2013-03-13 21:34:41

回答

3

我複製並粘貼您的代碼,並編譯和運行正常,沒有異常拋出。你的代碼是否有其他部分導致這種情況?


我完整的代碼是:

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作爲它的輸出。

+0

有趣,我發現通過將我的代碼封裝在 中。感謝您的反饋。我宣佈addrLong爲靜態最終,但我不認爲這會影響它? – uzrbin 2011-03-04 22:20:45

+0

所以,我試着做同樣的事情。並得到了相同的結果。 (它在獨立運行時起作用)我想我會在tomcat環境中發現這些東西。 – uzrbin 2011-03-04 22:34:22

相關問題