#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
если строка запроса содержит параметр, в котором нет=
параметра.