java Servlets加2个数字

时间:2018-07-04 17:09:07

标签: java servlets

我的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>

当我在Web浏览器中单击提交代码时,它不支持返回HTTP Status 405 get方法。现在它返回HTTP状态500。

java.lang.NumberFormatException.

请给我正确的密码,以便可以加上两个数字。

4 个答案:

答案 0 :(得分:1)

您将获得一个NumberFormatException,因为如果无法将Integer.parseInt(String)参数转换为整数,则String会将其抛出。参见documentation

您需要将整数分析包装在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");
}

编辑

正如评论中指出的那样,我选择捕获未经检查的异常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。在这两种情况下,结果都应该明显为阳性。

答案 1 :(得分:1)

似乎您正在解析请求参数“ num2”,但是在html中,您的输入仅重复了“ num1”。

因此,在servlet中,您正在请求不存在的参数“ num2”,并提供了一个null值,并提供了java.lang.NumberFormatException异常:null。

首先,您需要更正HTML输入,建议您使用try-catch块来解析Servlet中的这些输入值(以处理不同的情况:空值,非数字,浮点值等)。

答案 2 :(得分:0)

尝试添加三个或四个数字,而不是两个。我认为这将帮助您了解问题所在。

答案 3 :(得分:0)

大多数答案已经指出,问题出在表单本身。

但是查看了所有答案之后,大多数答案都鼓励一件事-在try / catch块中处理未经检查的异常(在本例中为java.lang.NumberFormatException)。

请注意!未经检查的异常决不应该在try / catch块中处理(即使您希望摆脱异常)。您需要认识到处理未检查的异常的想法只有在获取不正确的数据之后才会引起。并且它可能导致服务器正常运行,返回错误的结果并使跟踪错误变得非常困难。

如果没有数据,就不可能猜测可能发生的异常。因此,请不要鼓励在try / catch块中处理未经检查的异常。如果您确实想处理未检查的异常,请使用验证(例如条件)来进行。这样,您将确保数据将根据您的要求通过特定条件,并且可以检查是否存在无效输入。

注意:引发此类异常甚至更加灾难性。