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
相关产品推荐
相关产品推荐

