Java技术问题:数字格式异常及JSP用户列表传值失败排查
我来帮你逐个解决这两个开发问题:
问题1:java.lang.NumberFormatException: 输入字符串为"aNumber"
这个异常说白了就是你在尝试把一个根本不是数字的字符串转成数字类型(比如调用Integer.parseInt("aNumber")或者Double.valueOf("aNumber")),JVM没法把"aNumber"解析成合法数字,所以直接抛出了这个异常。
几种靠谱的解决办法:
- 提前校验格式:在转换前先判断字符串是否符合数字规则,用正则表达式就能搞定:
String input = "aNumber"; // 匹配整数或带小数的数字,支持负号 if (input.matches("-?\\d+(\\.\\d+)?")) { int num = Integer.parseInt(input); // 这里写转换后的业务逻辑 } else { // 给用户提示输入合法数字,或者做其他异常处理 System.out.println("请输入有效的数字!"); } - 捕获异常兜底:要是没法提前校验,就用try-catch把异常接住,别让程序直接崩了:
try { int num = Integer.parseInt("aNumber"); } catch (NumberFormatException e) { // 可以记录日志,或者给前端返回友好提示 e.printStackTrace(); System.out.println("输入内容不是有效数字,请检查!"); } - 用工具类偷懒:Apache Commons Lang的
NumberUtils类有安全转换方法,失败了会返回默认值,不用自己写校验:// 转换失败就返回0,你也可以改成其他默认值 int num = NumberUtils.toInt("aNumber", 0);
问题2:Controller获取的用户列表无法传递到JSP页面
先看你给的Controller代码,我梳理了几个可能的坑,再给你对应解决方案:
先排查代码里的明显问题:
- 分支没写全:你的代码只有当
roType是qualZRO1时才会往Model里塞数据并返回视图,如果roType是其他值,方法没有返回语句,这会直接导致请求报错!先把分支补全:@PostMapping("/list") public String listCandidates(@RequestParam("list") String roType, Model theModel) { if(roType.equalsIgnoreCase("qualZRO1")) { List qList = adgService.getQualCandListZRO1(); // 先打印确认列表有没有数据 System.out.println("候选人列表容量:" + qList.size()); theModel.addAttribute("candlist", qList); return "adgSummary"; } // 其他情况也要返回一个视图,比如默认页面或者错误页 return "default-view"; } - JSP里EL表达式用错了:要在JSP里拿到Model的
candlist,得用JSTL遍历,先确保引入了标签库:
然后用<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>c:forEach遍历列表,注意属性名要和Controller里的candlist完全一致(大小写敏感!):
要是EL表达式不生效,记得在page指令里加<div class="candidate-list"> <table> <tr> <th>ID</th> <th>姓名</th> <!-- 其他字段根据你的实体类调整 --> </tr> <c:forEach items="${candlist}" var="cand"> <tr> <td>${cand.id}</td> <td>${cand.name}</td> </tr> </c:forEach> </table> </div>isELIgnored="false",老版本的web.xml可能会默认忽略EL。 - 请求方式和路径要对应:你的Controller用的是
@PostMapping("/list"),前端请求必须是POST方法,而且路径要正确指向/list,不然根本不会进入这个方法。 - 属性名拼写别错:Controller里是
"candlist",JSP里就必须是${candlist},大小写、拼写差一个字符都拿不到数据!
验证小技巧:
在Controller里打印qList的长度,确认服务层确实返回了数据,别是列表本身就是空的,那JSP当然显示不出来。
内容的提问来源于stack exchange,提问作者JayeshB
相关产品推荐
相关产品推荐

