java.lang.NumberFormatException: For input string: ""解决方案
引起异常的主要原因如下:
-
1.传参字段和映射字段不一致 2.传参类型和映射类型不一致 3.时间类型转换时间戳长度不一致 4.参数长度和数据库不一致
Service 层代码
public Route findOne(String rid) { //routeDao findOne Route route = routeDao.findOne(Integer.parseInt(rid.trim())); List<RouteImg> routeImg = routeImageDao.findByRid(Integer.parseInt(rid.trim())); route.setRouteImgList(routeImg); Seller seller = sellerDao.findById(route.getSid()); route.setSeller(seller); return route; }
Dao 层代码
public Route findOne(int rid) { String sql = "select * from tab_route where rid = ?"; Route route = template.queryForObject(sql, new BeanPropertyRowMapper<Route>(Route.class), rid); return route; }
Integer cid = Integer.parseInt(request.getParameter(“cid”));
在进行前后端交互时,在后端通过request.getParameter(" ")方式来获取请求信息,此时获取到的值为String类型,而在数据库中数值我们通常使用Int等来存储,Dao层中的方法使用int类型作为参数传入方法,所以在service层中进行调用时就要进行数据类型的转换:Integer.parseInt(request.getParameter(“cid”));在servlet层进行方法调用时,如果前端页面的请求中该参数为空就会在该转换操作过程中出现异常。控制台报错如下:
public void findOne(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取rid String rid = req.getParameter("rid"); //调用service方法查询route对象 Route route = routeService.findOne(rid); //调用writeValue方法将json写回前端yemain writeValue(route,resp); }
Caused by: java.lang.NumberFormatException: For input string: "" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:592) at java.lang.Integer.parseInt(Integer.java:615)
解决方案:
对前端获取到的值进行判断
try { if(rid!=null){ Route route = routeService.findOne(rid); //调用writeValue方法将json写回前端yemain writeValue(route,resp); } } catch (Exception e) { System.out.println("rid为空调用不成功"); }
即接收数据的变量就用String型即可,验空时也不需要再转换一次类型,
在使用时再将接收数据的变量转为需要的类型即可。