ClientServlet注册接口报HTTP500错误,抛出NumberFormatException: null异常
问题根因定位
NumberFormatException: null的触发逻辑没有任何歧义:Integer.parseInt()方法收到了值为null的入参。对应你堆栈里的触发位置,问题出在doPost第53行处理contact参数的逻辑——你直接把request.getParameter("contact")的返回值传给了parseInt(),但这个参数实际上根本没传到服务端。
高频触发原因
- 前后端参数key不匹配:前端表单对应输入框的
name属性,和后端写的取参key大小写、字符不完全一致,比如前端写name="contactNum",后端取"contact",拿到的结果必然是null。 - 表单提交时遗漏参数:输入框没有被
<form>标签包裹、用户没有填写对应字段就点提交,浏览器不会把这个字段的值附在请求里。 - 路径映射错位:前端表单的
action地址和Servlet的/register映射不匹配,请求根本没走到你写的doPost逻辑。
快速定位+修复方法
- 第一步先加一行调试代码,把请求携带的所有参数直接打印在控制台,提交一次表单就能看到实际传了哪些key,10秒就能定位是key不匹配还是参数没传:
System.out.println("请求携带的全量参数: " + request.getParameterMap()); - 删掉直接转换的逻辑,给参数加前置校验,不要让null值流到类型转换环节,正确的参数处理写法参考:
String contactRaw = request.getParameter("contact"); int contact; // 先做空值判断,不满足直接拦截返回前端提示 if (contactRaw == null || contactRaw.trim().isEmpty()) { request.setAttribute("errorTip", "联系电话不能为空"); request.getRequestDispatcher("/register.jsp").forward(request, response); return; } // 转换时加异常捕获,避免格式不对直接抛500 try { contact = Integer.parseInt(contactRaw.trim()); } catch (NumberFormatException e) { request.setAttribute("errorTip", "联系电话必须输入纯数字"); request.getRequestDispatcher("/register.jsp").forward(request, response); return; } - 核对前端配置:确认联系电话输入框的
name属性和后端取参的key完全一致,没有多余空格、大小写差异;同时确认表单的提交地址和Servlet的/register映射完全匹配。
内容的提问来源于stack exchange,提问作者Asma Butt
相关产品推荐
相关产品推荐

