【问题标题】:Illegal state exception when putting in a Map放入地图时出现非法状态异常
【发布时间】:2011-04-20 02:05:51
【问题描述】:

我不明白为什么我会通过以下代码得到臭名昭著的“IllegalStateException”:

private void mergeQueryStrings(String url, Map parameterMap) {
    String queryString = getQueryString(url);
    if(queryString!=null){
        String [] params = queryString.split("&");
        for(String param:params){
            parameterMap.put(param.split("=")[0], param.split("=")[1]);
        }
    }
}

有人能告诉我吗?

【问题讨论】:

  • 乍一看,我看不出有什么问题。这个异常是在哪一行抛出的?
  • 没什么明显的,但你有很多信息没有分享。哪一行产生了异常?异常的信息是什么? url 的哪些值会导致异常发生?什么Map 实现被传递到方法中?

标签: java exception illegalstateexception


【解决方案1】:

您提供了一个不可修改的地图。例如,ServletRequest#getParameterMap() 是不可变的。如果您无法控制提供的地图,那么您需要创建一个新地图,将新项目放在那里,返回并使用它。

private Map mergeQueryStrings(String url, Map parameterMap) {
    Map newParameterMap = new HashMap(parameterMap);
    String queryString = getQueryString(url);
    if(queryString!=null){
        String [] params = queryString.split("&");
        for(String param:params){
            newParameterMap.put(param.split("=")[0], param.split("=")[1]);
        }
    }
    return newParameterMap;
}

如果您实际上为此使用了 servlet 请求参数映射,那么您希望在 Filter 中的 HttpServletRequestWrapper 的帮助下替换原来的映射。但这是一个完全不同的故事:)


与具体问题无关,您应该在将查询字符串部分放入新地图之前url-decode

【讨论】:

猜你喜欢
  • 2014-02-12
  • 2013-02-06
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多