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

JSP调用JavaBean的calculatePayment()方法出现空指针异常求助

问题描述

我正在学习JSP和JavaBeans,开发了一个计算贷款还款额的简单Web应用,该应用可通过表单正确设置Bean的字段,但无法从JSP页面调用Bean中的calculatePayment()方法。已查阅资料并检查代码,但未找到解决办法,恳请帮助。

服务器日志报错信息

org.apache.jasper.JasperException: An exception occurred processing [/index.jsp] at line [56]

53:         <table>
54:             <tr>
55:                 <td>Annual payment is</td>
56:                 <td>${loanBean.calculatePayment()}</td>
57:             </tr>
58:         </table>
59:     </body>

根本原因

jakarta.el.ELException: java.lang.NullPointerException: Cannot invoke "String.trim()" because "in" is null

相关代码片段

LoanBean中的calculatePayment()方法

public String calculatePayment() {
    double P = Double.parseDouble(loanAmount);
    double r = Double.parseDouble(rate);
    double t = Double.parseDouble(term);
        
    double A = P*(Math.pow(1 + r, t));
        
    DecimalFormat df = new DecimalFormat("#.##");
    String num_string = df.format(A);
    return num_string;    
}

JSP页面实例化Bean并设置字段的代码

<%@page contentType="text/html" pageEncoding="UTF-8" session="true"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Klausen_Chapter5_Problem1_LoanCalculator</title>
    </head>
    <body>
        <jsp:useBean id="loanBean"  scope="session"  class="loancalculator.beans.LoanBean"/>

        <jsp:setProperty name="loanBean" property="arrangementFee"/>
        <jsp:setProperty name="loanBean" property="loanAmount"/>
        <jsp:setProperty name="loanBean" property="rate"/>
        <jsp:setProperty name="loanBean" property="term"/>
        <h1>Loan Calculation</h1>
        <form name="form1"  method="post">
            <table>
                <tr>
                    <td>Arrangement fee :</td>
                    <td><input type="text"  name="arrangementFee" value="${loanBean.arrangementFee}"/>
                </tr>
                <tr>
                    <td>Enter loan amount :</td>
                    <td><input type="text"  name="loanAmount"  value="${loanBean.loanAmount}"></td>
                </tr>
                                     -----   more rows and input elements ----

                <tr><td></td>
                    <td><input type="submit"  value="Clear"/>
                        <input type="submit"  value="Calculate"/>
                    </td>
                </tr>
            </table>
        </form>
        
        <br><br>
        <table>
            <tr>
                <td>Annual payment is</td>
                <td>${loanBean.calculatePayment()}</td>
            </tr>
        </table>
    </body>
</html>

解决方案

1. 修正JSP语法错误

JSP页面中loanAmount对应的input标签缺少闭合符号,补充完整:

<input type="text" name="loanAmount" value="${loanBean.loanAmount}"/>

2. 处理Bean属性空值问题

首次访问页面或未提交表单时,Bean的loanAmount、rate、term属性为null,直接调用parseDouble()会触发异常。修改calculatePayment()方法,增加空值和格式校验:

public String calculatePayment() {
    // 检查属性是否为空或空白字符串
    if (loanAmount == null || loanAmount.trim().isEmpty() 
        || rate == null || rate.trim().isEmpty() 
        || term == null || term.trim().isEmpty()) {
        return "请先输入完整贷款信息";
    }
    
    try {
        double P = Double.parseDouble(loanAmount);
        double r = Double.parseDouble(rate);
        double t = Double.parseDouble(term);
            
        double A = P*(Math.pow(1 + r, t));
            
        DecimalFormat df = new DecimalFormat("#.##");
        return df.format(A);    
    } catch (NumberFormatException e) {
        return "输入数值格式不正确";
    }
}

3. 控制计算结果显示时机

仅当用户点击"Calculate"提交表单后,再显示计算结果,避免页面加载时调用方法引发异常:

<br><br>
<% if (request.getParameter("Calculate") != null) { %>
    <table>
        <tr>
            <td>Annual payment is</td>
            <td>${loanBean.calculatePayment()}</td>
        </tr>
    </table>
<% } %>

若使用JSTL标签,可替换为:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
...
<br><br>
<c:if test="${not empty param.Calculate}">
    <table>
        <tr>
            <td>Annual payment is</td>
            <td>${loanBean.calculatePayment()}</td>
        </tr>
    </table>
</c:if>

内容的提问来源于stack exchange,提问作者azeemofwalsall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 06:00:23