Вы получаете NumberFormatException
, потому что Integer.parseInt(String)
выдает его, если аргумент String
не может быть преобразован в целое число. См. документацию .
Вам нужно обернуть целочисленный синтаксический анализ в try-catch и обработать исключение, если вы не хотите, чтобы оно было выброшено, ИЛИ заранее проверить, что предоставленный String
действительно является целым числом.
Также внимательно посмотрите на свою форму. У вас есть
<form action="add">
Enter 1st number: <input type="text" name=num1><br>
Enter 2nd number: <input type="text" name=num1><br>
<input type="submit">
</form>
Это имеет num1
дважды, что даст вам null
, когда вы попытаетесь получить параметр для num2
в вашем req
.
Измените его на
<form action="add">
Enter 1st number: <input type="text" name="num1"><br>
Enter 2nd number: <input type="text" name="num2"><br>
<input type="submit">
</form>
Например:
String num1 = req.getParameter("num1");
String num2 = req.getParameter("num2");
try {
int i = Integer.parseInt(num1);
int j = Integer.parseInt(num2);
int k = i + j;
// TODO do something with k
} catch (NumberFormatException e) {
// log exception and / or notify user
System.out.println("At least one invalid number in the given numbers: " + num1 + ", " + num2);
e.printStackTrace();
// show an error message to the user somewhere in your frontend
req.setAttribute("error", "your error message");
}
EDIT
Как указано в комментариях, я решил перехватить непроверенное исключение NumberFormatException
, зарегистрировать его и установить атрибут в запросе, чтобы показать пользователю значимое сообщение об ошибке.
Я сделал это, потому что, позволяя всплыть непроверенному исключению в случае, если хотя бы одно из введенных чисел не может быть разобрано в целочисленное значение, его нужно обрабатывать дальше по цепочке, чтобы отобразить что-то значимое пользователю, а не общее сообщение об ошибке внутреннего сервера.
Альтернативой использованию логики, описанной выше, было бы использование регулярного выражения для проверки ввода для каждого из целых чисел.
Еще одним проверочным соображением, которое не было затронуто здесь, является возможность переполнения. Это может произойти в двух случаях:
- Пользователь вводит целое число, большее
Integer.MAX_VALUE
.
- Пользователь вводит два целых числа, сумма которых больше
Integer.MAX_VALUE
.
В первом случае, например
System.out.println(Integer.parseInt("" + (Integer.MAX_VALUE + 1)));
напечатает -2147483648
А во втором случае
int a = Integer.parseInt("" + (Integer.MAX_VALUE));
int b = Integer.parseInt("" + (Integer.MAX_VALUE));
System.out.println(a + b);
напечатает -2
. В обоих случаях результат должен быть положительным.