2015-02-20 4 views
1

У меня есть форма HTML, которая вызывает сервлет Java и форма содержит 20 флажков (например, с именами c1, c2, c3 ... c20).Java ошибка NullPointerException преобразования Int в строку

Я пытаюсь захватить значение этих флажков в булевом массиве java cbox.

Следующий код ...

int ii=0; 
boolean cbox[] = new boolean[20]; 
for (ii=0; ii<20; ii++) 
    cbox[ii] = (req.getParameter("c"+String.valueOf((int)(ii+1))).equals("on"))?true:false; 

дает java.lang.NullPointerException.

Но я не получаю ошибку во время выполнения, если бы я изменить его (например, удалить ii в valueOf):

cbox[ii] = (req.getParameter("c"+String.valueOf((int)(1))).equals("on"))?true:false; 

Конечно, это не получит меня, где я хочу. Я, должно быть, глупая ошибка, но я не могу это заметить. Кто-нибудь это видит?

ответ

1

проблема здесь в сервлете, вы получите on как значение по умолчанию для html selected checkbox else null. Поскольку все флажки не отмечены, вы получаете NPE.Попробуйте этот код:

boolean[] cbox = new boolean[20]; 
for(int i = 0; cbox.length > i; i++) { 
    cbox[i] = null != req.getParameter("c" + (1 + i));//if not null then true else false 
} 

Вы также можете пойти с другим вариантом:

в вашем HTML/JSP создает флажки с таким же именем, но с разным значением:

<input type="checkbox" name="cbox" value="1"/> 
<input type="checkbox" name="cbox" value="2"/> 
... 
<input type="checkbox" name="cbox" value="20"/> 

в сервлета вы можете получить все флажки с одной строкой:

String[] cbox = req.getParameterValues("cbox"); 

Здесь вы не получите on в качестве значения, его gona be 1, 2 и т. Д. Согласно выбору. Только отмеченные поля вы получите здесь.

+0

Спасибо @arvind, по крайней мере, я подтвердил, что ваше первое решение выше отлично работает. Очень краткий! – user46688

2

A NullPointerException возникают при попытке ссылаться на объект, который не инициализирован (null).

Глядя на ваш код, есть две возможности:

  • REQ является нулевым req.getParameter.
  • Параметр, который вы пытаетесь извлечь, не существует, поэтому он равен req.getParameter("c"+String.valueOf((int)(ii+1))).

Кстати, если возвращаемый параметр уже является логическим, нет необходимости проверять его значение и возвращать true или false, поскольку это значение уже верно или false. Вы можете упростить его:

cbox[ii] = (req.getParameter("c"+String.valueOf((int)(ii+1))).equals("on")); 

Edit: Чтобы ответить на ваш комментарий, вы можете проверить, если параметр существует легко:

String param = req.getParameter("c" + String.valueOf(ii + 1)); 
cbox[ii] = "on".equals(param); 

Чтобы быть еще более безопасным, я бы также проверьте req, чтобы убедиться, что он не является нулевым.

if(req != null) 
{ 
    String param = req.getParameter("c" + String.valueOf((ii + 1)); 
    cbox[ii] = "on".equals(param); 
} 

Обратите внимание, что я удалил бросок (int)ii + 1 как выражение уже целочисленного типа.

Кроме того, если ii только будет использоваться в качестве итератора идентификатора, вы можете объявить его непосредственно в цикле, поэтому вместо того, чтобы сделать это:

int ii = 0; 
for(ii = 0; ii < 20; ii++) 

Вы можете напрямую написать for(int ii = 0; ii < 20; ii++)

+0

Это может объяснить это ... когда флажок не выбран, значение равно null. – user46688

+0

Спасибо, но он по-прежнему дает такую ​​же ошибку. Я думаю, это потому, что 'String.valueOf (null)' дает исключение NullPointerException (см. Http://stackoverflow.com/questions/3131865/why-does-string-valueofnull-throw-a-nullpointerexception). – user46688

+1

@ user46688 'ii + 1' не может быть null. Моя проверка действительно была неправильной, см. Новое редактирование. –

Смежные вопросы