ZhihanXing 发表于 2023-4-24 13:23:24

JSP中出现了java.lang.NullPointerException报错

课上学习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);
            s.setAge(Integer.parseInt(arr));
            s.setScore(Integer.parseInt(arr));
            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);
    }
}

恳请各位大佬指正

isdkz 发表于 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错误,同时也保证了表格标题的正确显示。希望这些修改能帮助你解决问题。
页: [1]
查看完整版本: JSP中出现了java.lang.NullPointerException报错