You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JSP BMI计算页面报org.apache.jasper.JasperException错误求助

问题排查与修复方案

错误根源分析

抛出org.apache.jasper.JasperException的核心原因有两个:

  1. 表单结构错误:身高、体重输入框不在<form>标签内部,提交表单时无法传递输入值,导致request.getParameter("txtChieuCao")和request.getParameter("txtCanNang")返回null,调用Double.parseDouble(null)会直接抛出异常。
  2. 无参数校验逻辑:页面首次加载或用户未输入内容就提交时,未判断参数是否存在/合法就直接执行类型转换,触发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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 04:39:34