JSTL foreach访问子类变量触发NPE:数据存在仍报空指针异常
问题分析与解决方案
核心原因
触发NullPointerException的关键原因是静态内部类Option的访问权限不足:
你定义的Option是OptionSingleSelectQuestion的包级私有静态内部类(未加public修饰符),而JSP编译后的Servlet类通常不在与实体类相同的包下。EL表达式通过反射调用getLabel()方法时,因无法访问包级私有类的方法,导致反射获取方法实例为null,最终触发NPE。
另外你的EL写法也不符合规范(虽非直接报错原因):EL表达式推荐使用属性访问语法,而非直接调用getXXX()方法。
修复步骤
- 修改内部类访问权限
将Option静态内部类改为public,确保JSP容器能通过反射正常访问其方法:
final public class OptionSingleSelectQuestion extends Question { // 添加public修饰符 public static class Option { @Getter private String uuid; @Getter private String label; } @Getter private List<Option> options; @Getter private String optionChosen; }
- 优化EL表达式写法
使用EL属性访问语法替代直接调用get方法,更简洁且符合规范:
<c:forEach var="option" items="${question.options}"> ${option.label} </c:forEach>
- 额外验证点
- 确认后台传递到JSP的
question变量是OptionSingleSelectQuestion的实例,而非父类Question的实例; - 确认
options列表中的每个Option对象都不为null,且label字段已完成赋值。
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

