Исключение недопустимого состояния при вводе карты

#java #exception #illegalstateexception

#java #исключение #исключение illegalstateexception

Вопрос:

Я не понимаю, почему я получаю печально известное «IllegalStateException» со следующим кодом:

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

Кто-нибудь может меня просветить?

Комментарии:

1. На первый взгляд я не вижу ничего плохого. В какой строке выдается это исключение?

2. Ничего очевидного, но у вас есть много информации, которой вы не поделились. Какая строка генерирует исключение? Какое сообщение от исключения? Какие значения url вызывают возникновение исключения? Какая Map реализация передается в метод?

Ответ №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("amp;");
        for(String param:params){
            newParameterMap.put(param.split("=")[0], param.split("=")[1]);
        }
    }
    return newParameterMap;
}
  

Если вы на самом деле использовали для этого параметр map запроса сервлета, то вы хотели бы заменить исходный с помощью a HttpServletRequestWrapper в a Filter . Но это совершенно другая история 🙂


Не связано с конкретной проблемой, вам следует декодировать части строки запроса по URL-адресу, прежде чем помещать их в новую карту.

Комментарии:

1. 1 и еще одна вещь, на которую следует обратить внимание: param.split("=")[1] может выдавать, ArrayIndexOutOfBoundsException если строка запроса содержит параметр, в котором нет = параметра.