Сервлеты Java добавление 2 номеров - PullRequest
0 голосов
/ 04 июля 2018

мой файл Java выглядит следующим образом -----

package servletjsp;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AddServlet extends HttpServlet 
{
    public void service(HttpServletRequest req,HttpServletResponse res) 
    {
        int i=Integer.parseInt(req.getParameter("num1"));
        int j=Integer.parseInt(req.getParameter("num2"));

        int k=i+j;
        System.out.println("the result is "+ k);
    }
} 

Мой HTML-файл выглядит следующим образом ----

<!DOCTYPE html>
<html>
    <body>
        <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>
    </body>
</html> 

мой файл web.xml выглядит следующим образом ----

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" 
         version="3.1">
    <servlet>
        <servlet-name>abc</servlet-name>
        <servlet-class>servletjsp.AddServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>abc</servlet-name>
        <url-pattern>/add</url-pattern>
    </servlet-mapping>  
</web-app>

когда я нажал на кнопку отправки кода в веб-браузере, он возвращал HTTP Status 405 метод get не поддерживается; теперь он возвращает HTTP Status 500.

java.lang.NumberFormatException.

Пожалуйста, дайте мне правильный код, чтобы он мог добавить 2 цифры.

Ответы [ 4 ]

0 голосов
/ 04 июля 2018

Как уже указывалось в большинстве ответов, проблема была в самой форме.

Но, посмотрев на все ответы, большинство из них поощряет одну вещь - обработку непроверенного исключения в блоке try / catch (в данном случае java.lang.NumberFormatException).

Пожалуйста, обратите внимание! Непроверенные исключения НИКОГДА не предназначены для обработки внутри блока try / catch (даже если вы хотите избавиться от исключения). Вы должны понимать, что идея обработки неконтролируемого исключения возникает ТОЛЬКО после получения неверных данных. И это может привести к нормальному функционированию сервера, возвращая вам неправильный результат и значительно усложняя отслеживание ошибки.

А без данных невозможно даже догадаться об исключении, которое может произойти. Поэтому, пожалуйста, не поощряйте обработку непроверенных исключений в блоке try / catch. Если вы действительно хотите обрабатывать непроверенные исключения, сделайте это с помощью проверок (например, условий). Таким образом, вы будете гарантировать, что данные будут соответствовать определенным условиям в соответствии с вашими требованиями, и вы можете проверить, есть ли там неправильный ввод.

Примечание: Еще более пагубно создавать такие исключения.

0 голосов
/ 04 июля 2018

Попробуйте добавить три или четыре числа вместо двух. Я думаю, что это поможет вам понять, что пошло не так.

0 голосов
/ 04 июля 2018

Кажется, вы анализируете параметр запроса "num2", но в вашем html ваш вход дублируется только "num1".

Таким образом, в сервлете вы запрашиваете параметр "num2", который не существует, давая нулевое значение, давая вам исключение java.lang.NumberFormatException: null.

Сначала вам нужно исправить входные данные HTML, и рекомендуется использовать блок try-catch для анализа этих входных значений в сервлете (для обработки различных случаев: нулевых значений, не числовых, значений с плавающей запятой и т. Д.).

0 голосов
/ 04 июля 2018

Вы получаете 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, зарегистрировать его и установить атрибут в запросе, чтобы показать пользователю значимое сообщение об ошибке.

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

Альтернативой использованию логики, описанной выше, было бы использование регулярного выражения для проверки ввода для каждого из целых чисел.

Еще одним проверочным соображением, которое не было затронуто здесь, является возможность переполнения. Это может произойти в двух случаях:

  1. Пользователь вводит целое число, большее Integer.MAX_VALUE.
  2. Пользователь вводит два целых числа, сумма которых больше 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. В обоих случаях результат должен быть положительным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...