JSP BMI计算页面报org.apache.jasper.JasperException错误求助
问题排查与修复方案
错误根源分析
抛出org.apache.jasper.JasperException的核心原因有两个:
- 表单结构错误:身高、体重输入框不在
<form>标签内部,提交表单时无法传递输入值,导致request.getParameter("txtChieuCao")和request.getParameter("txtCanNang")返回null,调用Double.parseDouble(null)会直接抛出异常。 - 无参数校验逻辑:页面首次加载或用户未输入内容就提交时,未判断参数是否存在/合法就直接执行类型转换,触发
NumberFormatException或NullPointerException。
修复步骤与代码示例
1. 修正表单结构
将包含输入框的表格整体移入<form>标签内,确保提交时能携带输入参数。
2. 添加参数校验逻辑
- 判断参数是否存在且非空
- 校验输入是否为有效数字,避免类型转换失败
- 仅当参数合法时才执行BMI计算
修改后的完整代码:
<div class="title"> KIỂM TRA BMI CỦA BẠN </div> <div> <form action="checkBMI.jsp" method="post"> <table> <tr> <td>Chiều cao:</td> <td><input type="text" name="txtChieuCao" placeholder="Enter your height (m)!"></td> </tr> <tr> <td>Cân nặng:</td> <td><input type="text" name="txtCanNang" placeholder="Enter your weight (kg)!"></td> </tr> <tr> <td>Kết Quả BMI:</td> <td> <% String chieuCaoStr = request.getParameter("txtChieuCao"); String canNangStr = request.getParameter("txtCanNang"); // 仅当表单提交且参数非空时执行计算 if (chieuCaoStr != null && !chieuCaoStr.trim().isEmpty() && canNangStr != null && !canNangStr.trim().isEmpty()) { try { double height = Double.parseDouble(chieuCaoStr); double weight = Double.parseDouble(canNangStr); // 额外校验身高体重是否为正数 if (height > 0 && weight > 0) { double BMI = weight / (height * height); out.println("BMI: " + String.format("%.2f", BMI) + "<br>"); if (BMI < 18.5) { out.println("Bạn đang thiếu cân! Bạn nên có chế độ ăn phù hợp hơn!"); } else if (BMI <= 24.9) { out.println("Bạn đang có thể trạng khỏe mạnh, bạn nên duy trì thể trạng này!"); } else if (BMI <= 29.9) { out.println("Bạn đang thừa cân! Bạn nên có chế độ ăn phù hợp hơn!"); } else { out.println("Bạn đang béo phì! Bạn nên có chế độ ăn phù hợp hơn!"); } } else { out.println("Chiều cao và cân nặng phải là số dương!"); } } catch (NumberFormatException e) { out.println("Vui lòng nhập số hợp lệ cho chiều cao và cân nặng!"); } } %> </td> </tr> </table> <div> <input type="submit" value="Submit"> <input type="reset" value="Reset"> </div> </form> </div>
关键优化点说明
- 将输入框移入
<form>,确保提交时参数能正确传递 - 添加非空判断,避免页面首次加载时执行无效计算
- 用
try-catch捕获NumberFormatException,处理非数字输入的情况 - 新增身高体重正数校验,避免逻辑上的不合理计算
- 用
String.format("%.2f", BMI)格式化BMI值,显示更友好
内容的提问来源于stack exchange,提问作者Luân Nguyễn
相关产品推荐
相关产品推荐

