news 2026/6/27 2:10:47

JSP页面500报错:空对象属性访问实战避坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JSP页面500报错:空对象属性访问实战避坑

JSP页面直接输出实体对象空属性引发页面500报错实战案例

一、问题背景

传统Java Web项目开发中,大量业务页面使用JSP+EL表达式渲染数据。开发人员常直接通过${对象.属性}输出实体字段,忽略属性为null、实体对象本身为空的场景。
当实体对象为null,或目标属性未赋值时,EL表达式访问属性会触发NullPointerException,直接导致页面抛出500服务器异常,页面空白无法展示,线上出现用户访问页面报错问题。该问题无编译提示,仅运行时暴露,测试容易遗漏边界场景。

二、错误代码演示(坑点复现)

1. 后端Servlet赋值代码

importjavax.servlet.ServletException;importjavax.servlet.annotation.WebServlet;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjava.io.IOException;@WebServlet("/userInfo")publicclassUserServletextendsHttpServlet{@OverrideprotectedvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{// 模拟查询无用户数据,对象直接赋值nullUseruser=null;request.setAttribute("user",user);request.getRequestDispatcher("user.jsp").forward(request,response);}}// 用户实体类classUser{privateStringusername;privateStringphone;// getter、setter省略publicStringgetUsername(){returnusername;}publicStringgetPhone(){returnphone;}}

2. 存在BUG的JSP页面 user.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>用户信息</title> </head> <body> <%-- 未做空值判断,直接访问对象属性 --%> <p>用户名:${user.username}</p> <p>手机号:${user.phone}</p> </body> </html>

运行异常现象

访问/userInfo后页面返回500错误,控制台抛出空指针异常:

java.lang.NullPointerException at org.apache.el.parser.AstValue.getValue(AstValue.java:167)

原理:user对象为null,执行user.username时EL底层调用getter方法,空对象调用方法直接触发空指针。
同理,若user对象存在,但phone属性为null,单纯输出不会报错,但如果后续拼接、逻辑判断仍会衍生展示异常。

三、主流修复方案

方案1:EL内置empty关键字判空(推荐轻量方案)

使用empty判断对象是否为空,为空展示默认占位文本,避免访问空对象属性。

<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <body> <c:if test="${empty user}"> <p>暂无用户信息</p> </c:if> <c:if test="${not empty user}"> <p>用户名:${user.username}</p> <p>手机号:${empty user.phone ? '未填写' : user.phone}</p> </c:if> </body> </html>

需引入核心标签库:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

方案2:后端赋默认对象兜底

后端查询无数据时,不返回null,新建空实体对象,避免页面空对象访问:

Useruser=userService.getById(1);// 兜底处理if(user==null){user=newUser();user.setUsername("暂无数据");user.setPhone("无");}request.setAttribute("user",user);

方案3:JSP脚本原生判空(不推荐,仅老旧项目兼容)

<% User user = (User)request.getAttribute("user"); String name = user == null ? "暂无用户" : user.getUsername(); %> <p>用户名:<%=name%></p>

缺点:混合Java脚本与HTML,破坏页面分层,不利于维护。

四、项目开发规范避坑总结

  1. JSP使用EL渲染对象前,必须通过empty判断对象非空,再读取内部属性;
  2. 字符串属性输出时使用三元表达式设置默认值,避免页面空白;
  3. 后端查询数据接口统一兜底,无数据时返回空实体而非null;
  4. 项目统一引入JSTL标签库,禁止大量内嵌Java脚本;
  5. 单元测试覆盖数据为空、属性为null边界场景,提前拦截页面500异常。

五、线上风险说明

该异常会直接阻断页面渲染,用户无法查看页面内容,严重影响使用体验;批量列表场景下,单条数据对象为空会导致整个页面崩溃,而非单条数据隐藏,故障影响范围大。

海量精选技术文档和实战案例持续更新,敬请关注【风骏时光少年】

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/27 2:08:58

Mega安汇:新手更在意的外汇市场服务体验,这里做个视角盘点

对多数外汇相关用户来说&#xff0c;判断平台并不需要复杂术语&#xff0c;关键在于信息能否被快速理解、关键提示是否容易找到、服务体验是否稳定一致。以Mega安汇为例&#xff0c;这里聚焦这些更贴近实际使用的亮点与细节。外汇相关平台的价值&#xff0c;体现在长期一致性与…

作者头像 李华
网站建设 2026/6/27 1:50:54

华为非AI方向笔试真题 6月24号【电影放映调度问题】

电影放映调度问题(C/Py/Java/Js/Go)题解华为笔试真题 6月24号 非AI方向第一题 100分题型题目内容 某电影院有 111 块银幕&#xff0c;每天需要安排多部电影在不同时段进行放映。每部电影有固定的放映时长和要求的放映时间段&#xff0c;且每个被选中放映的电影确保在对应时段能…

作者头像 李华
网站建设 2026/6/27 1:46:25

时空视觉重构 解锁营区物理空间全域透视新一代管理架构 技术解析白皮书

一、方案总纲本新一代营区全域透视管理架构由镜像视界浙江科技有限公司全栈源码自主研发&#xff0c;整套时空视觉重构核心演算课题纳入国家十四五重点研发课题序列&#xff0c;依托镜像视界浙江普陀时空大数据应用技术联合研究院完成多源时序视觉融合、像素三维空间反演、纯视…

作者头像 李华
网站建设 2026/6/27 1:42:06

《唤醒你的AI同事:WorkBuddy从零上手》020:配置常用连接器

本文是《唤醒你的 AI 同事——WorkBuddy 从零上手》系列 第 20 篇。 回顾总结:通过第 19 篇,我们了解了连接器的基本概念、工作原理以及它与技能的区别。连接器就像是 WorkBuddy 伸向外部的"手臂",可以连接 QQ 邮箱、腾讯文档、云盘等外部工具。 过渡语:理论已经…

作者头像 李华
网站建设 2026/6/27 1:35:51

069、Zephyr RTOS内核基础:功耗管理之睡眠模式

Zephyr RTOS内核基础:功耗管理之睡眠模式 从一次现场调试说起 去年冬天,我在一个工业传感器节点项目上栽了个跟头。设备部署在北方户外,电池供电,要求续航三年。第一版样机测试时,功耗曲线在凌晨三点突然跳出一个200mA的尖峰——这个时间点恰好是系统执行“深度睡眠”的…

作者头像 李华