java – Matcher在匹配后抛出IllegalStateException

前端之家收集整理的这篇文章主要介绍了java – Matcher在匹配后抛出IllegalStateException前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我对Matches有一些奇怪的问题,希望有人可以解决一些问题.
根据 Java文档:

public boolean matches() … If the
match succeeds then more information
can be obtained via the start,end,
and group methods.

一些代码

  1. private static Hashtable<String,String> splitAddress(String address){
  2. Hashtable<String,String> result = new Hashtable<String,String>();
  3.  
  4. Matcher m = addrLong.matcher(address);
  5. if (m.matches()) {
  6. result.put("number",m.group(1));

这是它抛出的地方:

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

仅此一点对我来说很奇怪.如果它有帮助,这里有更多信息:

  1. private static final String numberRegex = "[0-9]*[a-zA-Z]?"; // 123a 123
  2. private static final String compassRegex = "N|E|S|W|NORTH|EAST|SOUTH|WEST|NORD|EST|SUD|OUEST";
  3. 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";
  4.  
  5. addrLong = Pattern.compile("(" + numberRegex + ")\\s(.*)\\s(" + typeRegex + ")\\s?(" + compassRegex + ")?");

我一直在测试的输入字符串是“12 CLARE ST E”

谢谢!

编辑:哎呀,我粘贴了我的addrShort声明而不是我的addrLong

Edit2:我知道命名约定正在被打破.我发誓,我没有写那部分.

更新:

这可以作为独立函数成功执行.

任何想法为什么它会破坏tomcat环境?

我会看到我是否能找到任何可能影响这个的东西,但我的addrLong是我唯一的静态变量,不会在其他任何地方使用.

这真让我抓狂.我甚至尝试过:

  1. Pattern p = Pattern.compile("(" + numberRegex + ")\\s(.*)");
  2. Matcher m = p.matcher(address);
  3.  
  4. if (m.matches()) {
  5. result.put("number",m.group(1));

在我的服务器环境中,它失败了.

更新2

当它独自存在于servlet中时,它甚至运行良好.我很难过.任何提示或想法非常感谢.

更新3

拧它,我只是将功能移到另一个班级.感谢您的帮助@ mjg123,有一个当之无愧的复选标记.

这将永远打扰我…

解决方法

我复制并粘贴了你的代码,它按预期编译和运行,没有异常抛出.您的代码中是否还有其他部分导致此问题?

我的完整代码是:

  1. public class StackOverflow {
  2.  
  3. private static final String numberRegex = "[0-9]*[a-zA-Z]?"; // 123a 123
  4. private static final String compassRegex = "N|E|S|W|NORTH|EAST|SOUTH|WEST|NORD|EST|SUD|OUEST";
  5. 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";
  6. private static final Pattern addrLong = Pattern.compile("(" + numberRegex + ")\\s(.*)\\s(" + typeRegex + ")\\s?(" + compassRegex + ")?");
  7.  
  8. public static void main(final String[] args) {
  9. final String address = "12 CLARE ST E";
  10. final Hashtable<String,String> result = splitAddress(address);
  11. System.out.println(result.get("number"));
  12. }
  13.  
  14. private static Hashtable<String,String> splitAddress(final String address) {
  15. final Hashtable<String,String>();
  16.  
  17. final Matcher m = addrLong.matcher(address);
  18. if (m.matches()) {
  19. result.put("number",m.group(1));
  20. }
  21. return result;
  22. }
  23. }

哪个运行正常并打印12作为其输出.

猜你在找的Java相关文章