鱼C论坛

 找回密码
 立即注册
查看: 1085|回复: 1

[已解决]JSP中出现了java.lang.NullPointerException报错

[复制链接]
发表于 2023-4-24 13:23:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
课上学习Servlet和JSP做一个可以添加学生和查看学生的成绩管理系统,但是在查看学生时发生了500的错误:

错误截图

错误截图

相关代码:
<%@ page import="java.util.ArrayList" %>
<%@ page import="com.itheima.bean.Student" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2023/4/24
  Time: 10:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>查看学生成绩</title>
</head>
<body>
<table width="600px" border="1px">
    <tr>
        <th>学生姓名</th>
        <th>学生姓名</th>
        <th>学生姓名</th>
    </tr>
    <%
        ArrayList<Student> students = (ArrayList<Student>) session.getAttribute("students");
        if (students.size() != 0) {
            for (Student s : students) {
    %>
    <tr>
        <td><%=s.getUsername()%>
        </td>
        <td><%=s.getAge()%>
        </td>
        <td><%=s.getScore()%>
        </td>
    </tr>
    <%
            }
        }
    %>
</table>
</body>
</html>
对应的Servlet代码:
package com.itheima.servlet;

import com.itheima.bean.Student;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.ArrayList;

@WebServlet("/listStudentServlet")
public class ListStudentServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建字符输入流,读取相关文件
        //String realPath = getServletContext().getRealPath("stu.txt");
        BufferedReader br = new BufferedReader(new FileReader("c:/test/develop/stu.txt"));

        //创建集合保存对象
        ArrayList<Student> list = new ArrayList<>();

        //读取文件数据并封装
        String line;
        while ((line=br.readLine()) != null){
            Student s = new Student();
            String[] arr = line.split(",");
            s.setUsername(arr[0]);
            s.setAge(Integer.parseInt(arr[1]));
            s.setScore(Integer.parseInt(arr[2]));
            list.add(s);

        }

        //将数据存入会话域
        req.getSession().setAttribute("students",list);

        //重定向到查看学生页面
        resp.sendRedirect("/test/listStudent.jsp");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
恳请各位大佬指正
最佳答案
2023-4-24 13:26:07
从你的代码来看,这个问题可能是由于`students`这个session属性没有正确地初始化导致的。如果`ListStudentServlet`在查看学生的JSP页面之前没有被调用,那么`students`属性将不存在,从而导致NullPointerException。

为了解决这个问题,你可以在JSP页面中添加一个非空检查,以确保`students`不为空。如果`students`为null,你可以将其初始化为空列表,这样就不会出现NullPointerException了。

修改后的JSP代码如下:
<%
    ArrayList<Student> students = (ArrayList<Student>) session.getAttribute("students");
    if (students == null) {
        students = new ArrayList<>();
    }
    if (students.size() != 0) {
        for (Student s : students) {
%>
<tr>
    <td><%=s.getUsername()%>
    </td>
    <td><%=s.getAge()%>
    </td>
    <td><%=s.getScore()%>
    </td>
</tr>
<%
        }
    }
%>

另外,我注意到在`<table>`标签里的三个`<th>`标签的内容都是“学生姓名”,建议你修改为对应的标题,例如:
<tr>
    <th>学生姓名</th>
    <th>学生年龄</th>
    <th>学生成绩</th>
</tr>

这样,即使在第一次访问JSP页面时`ListStudentServlet`没有被调用,也不会出现NullPointerException错误,同时也保证了表格标题的正确显示。希望这些修改能帮助你解决问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-24 13:26:07 | 显示全部楼层    本楼为最佳答案   
从你的代码来看,这个问题可能是由于`students`这个session属性没有正确地初始化导致的。如果`ListStudentServlet`在查看学生的JSP页面之前没有被调用,那么`students`属性将不存在,从而导致NullPointerException。

为了解决这个问题,你可以在JSP页面中添加一个非空检查,以确保`students`不为空。如果`students`为null,你可以将其初始化为空列表,这样就不会出现NullPointerException了。

修改后的JSP代码如下:
<%
    ArrayList<Student> students = (ArrayList<Student>) session.getAttribute("students");
    if (students == null) {
        students = new ArrayList<>();
    }
    if (students.size() != 0) {
        for (Student s : students) {
%>
<tr>
    <td><%=s.getUsername()%>
    </td>
    <td><%=s.getAge()%>
    </td>
    <td><%=s.getScore()%>
    </td>
</tr>
<%
        }
    }
%>

另外,我注意到在`<table>`标签里的三个`<th>`标签的内容都是“学生姓名”,建议你修改为对应的标题,例如:
<tr>
    <th>学生姓名</th>
    <th>学生年龄</th>
    <th>学生成绩</th>
</tr>

这样,即使在第一次访问JSP页面时`ListStudentServlet`没有被调用,也不会出现NullPointerException错误,同时也保证了表格标题的正确显示。希望这些修改能帮助你解决问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 23:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表