如何解决NumberFormatException?Servlet数字相加报错求助
问题定位与修复方案
异常根源
你遇到的NumberFormatException是因为直接对null或者空字符串调用了Integer.parseInt()。触发场景包括:
- 跳过前端表单,直接访问Servlet的URL(比如
http://localhost:8080/你的应用名/add),此时请求里没有num1和num2参数,getParameter()返回null; - 用户未输入任何内容就提交表单,此时参数值是空字符串,
Integer.parseInt("")同样会抛出该异常。
修复代码与步骤
1. 后端添加参数校验与异常处理
修改AddServlet.java,先校验参数有效性,再做转换计算,同时捕获转换异常:
package com.adithya; import java.io.IOException; import java.io.PrintWriter; 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) throws IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); // 先获取参数 String num1Input = req.getParameter("num1"); String num2Input = req.getParameter("num2"); // 校验参数是否存在且不为空 if (num1Input == null || num1Input.trim().isEmpty() || num2Input == null || num2Input.trim().isEmpty()) { out.println("<h3>错误:请填写两个有效的数字!</h3>"); return; } try { // 安全转换为整数 int num1 = Integer.parseInt(num1Input); int num2 = Integer.parseInt(num2Input); int result = num1 + num2; out.println("<h3>result is " + result + "</h3>"); } catch (NumberFormatException e) { // 处理非整数输入的情况 out.println("<h3>错误:输入的不是有效整数,请重新输入!</h3>"); } } }
2. 前端优化(避免无效提交)
给前端表单添加基础校验,提前拦截无效输入,同时修正笔误(把2st改成2nd):
<!DOCTYPE html> <html> <body> <form action="add" onsubmit="return checkInput()"> Enter 1st number:<input type="text" name="num1" id="num1"><br> Enter 2nd number:<input type="text" name="num2" id="num2"><br> <input type="submit"> </form> <script> function checkInput() { let num1 = document.getElementById("num1").value.trim(); let num2 = document.getElementById("num2").value.trim(); if (!num1 || !num2) { alert("请填写两个数字!"); return false; } // 校验是否为整数 const integerRegex = /^-?\d+$/; if (!integerRegex.test(num1) || !integerRegex.test(num2)) { alert("请输入有效的整数!"); return false; } return true; } </script> </body> </html>
3. 确认Servlet映射配置
最后检查你的Servlet是否正确映射到/add路径:
- 如果用
web.xml配置,确保有如下内容:
<servlet> <servlet-name>AddServlet</servlet-name> <servlet-class>com.adithya.AddServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AddServlet</servlet-name> <url-pattern>/add</url-pattern> </servlet-mapping>
- 如果用注解,直接在
AddServlet类上添加@WebServlet("/add")即可。
内容的提问来源于stack exchange,提问作者Katla Adithya
相关产品推荐
相关产品推荐

