Servlet doPost抛出java.lang.NumberFormatException: null问题求助
问题原因
你遇到的报错根本原因是POST请求没有携带id参数:
- 你点击编辑链接进入editVaccine页面时,
id是作为GET请求的查询参数传递的,但是你在doGet方法生成的编辑表单里,没有把这个id值包含在提交的内容里,所以POST请求发出去的时候没有id参数,request.getParameter("id")返回null,转Integer就抛出了NumberFormatException。 - 除此之外你的代码还有几个隐藏错误,后续也会导致运行异常,也需要同步修复。
修复步骤
1. 编辑表单添加id隐藏域
在editVaccine的doGet方法生成的form表单内,添加一个隐藏的input控件存储id值,这样POST提交时就能把id带过去:
// 放在form标签的下一行即可 html.append("<form action='editVaccine' method='post'>" ); html.append("<input type='hidden' name='id' value='" + id + "'/>"); // 后面原有代码保持不变
2. 修正下拉选择框的错误
你当前的select控件写法有两个问题:
- select的name属性是
DosesReq,但你在doPost里取参数的时候用的是dosage,永远取不到值 - 每个option都重复设置了value属性,不会自动匹配当前疫苗的剂量数,需要根据当前值设置selected属性
修改后的下拉框代码参考:
html.append("<tr><th colspan='2'>Doses Required</th>" + "<td><select name='dosage'>"); String curDose = entry.getDosesReq(); html.append("<option value='1' " + ("1".equals(curDose)?"selected":"") + ">1</option>"); html.append("<option value='2' " + ("2".equals(curDose)?"selected":"") + ">2</option>"); html.append("<option value='3' " + ("3".equals(curDose)?"selected":"") + ">3</option>"); html.append("</select></td>");
3. 修正ServletContext取值的key错误
你在ListVaccine的init方法里,把疫苗列表存在了key为ServletFunctions.VaccineEntries的属性里,但是editVaccine的getEntry方法里取的是"entries",这里key不一致会导致取到null,后续报空指针。修改getEntry里的取值代码:
List<VaccineEntry> entries = (List<VaccineEntry>) getServletContext() .getAttribute(ServletFunctions.VaccineEntries);
可选替代方案
你也可以选择把id加到form的action地址里,效果和隐藏域一致:
html.append("<form action='editVaccine?id=" + id + "' method='post'>" );
内容的提问来源于stack exchange,提问作者jb1145
相关产品推荐
相关产品推荐

