【Java Spring MVC项目异常解决】空指针异常NullPointerException

server/2024/10/18 7:46:45/

在Spring MVC项目中遇到空指针异常(NullPointerException)通常与项目中组件的使用有关,如控制器层(Controller)、业务层(Service)、Dao层、依赖注入等。

1、控制器层(Controller)

·依赖注入失效

如果UserService没有被正确地注入,这里访问userService时会抛出NullPointerException

java">@Resource
private UserService userService; 

解决方案:确保所有的依赖都被正确注入和扫描

·请求参数未被正确传递

如果从前端获取一个对象或参数,但是没有接收到,就会导致空指针异常

java">    // 显示添加用户页面@RequestMapping(value = "/userAdd")public String showAddUserPage() {return "useradd"; // 返回视图名称,"useradd" 是添加用户页面的视图名称}// 处理添加用户请求@RequestMapping(value = "/addUser",method = {RequestMethod.GET, RequestMethod.POST})public String addUser(@RequestParam("userCode") String userCode,@RequestParam("userName") String userName,HttpSession session) {// 创建用户对象并设置属性User user = new User();user.setUserCode(userCode);user.setUserName(userName);user.setCreatedBy(((User) session.getAttribute(Constants.USER_SESSION)).getId());// 调用服务层方法boolean success = userService.add(user);if (success) {return "redirect:/user/query"; // 添加成功,重定向到用户查询页面} else {return "useradd"; // 添加失败,返回到添加用户页面}}

解决方案:打断点检查参数是否为null

2、业务层(Service)

·返回值问题

业务层或Dao层的方法可能返回null,如果没有进行空值检查就直接使用,就可能导致空指针异常

java">public User findUserById(Long id) {// 从数据库查询用户User user = userRepository.findById(id).orElse(null);return user; // 如果没有找到用户,则返回null
}

解决方案:检查需要返回null的相关方法

3、Dao层

·数据库操作返回null

例如,查找一个不存在的记录可能返回null,而代码未对此进行处理

java">public class UserDao {private Connection connection;public UserDao(Connection connection) {this.connection = connection;}public String getUserNameById(int userId) {String sql = "SELECT name FROM users WHERE id = ?";try (PreparedStatement stmt = connection.prepareStatement(sql)) {stmt.setInt(1, userId);ResultSet rs = stmt.executeQuery();if (rs.next()) {return rs.getString("name"); // 返回用户名}} catch (SQLException e) {e.printStackTrace();}return null; // 如果没有找到用户,返回null}
}

解决方案:进行null检查


http://www.ppmy.cn/server/13213.html

相关文章

【C#】防御性编程策略float.TryParse()

float.TryParse(Result[0].ToString(), out realValue1);这行C#代码用于尝试将一个字符串转换成浮点数(float)。具体来说,它使用了 float.TryParse 方法,这是一个非常常用的方法,用于在转换时提供错误处理,…

QT客户端开发的技术难点

QT是一种功能强大且灵活的跨平台应用程序开发框架,但也存在一些技术难点,需要开发者仔细考虑和克服。以下是一些常见的QT开发技术难点。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1. 跨平台兼容性 QT框架…

值传递和地址传递

文章目录 目录值传递地址传递 目录 值传递 package com.zhang.parameter; //值传递 public class MethodDemo1 {public static void main(String[] args) {int a 10;System.out.println(a);System.out.println("~~~~~~~~~~~~~~~");change(a);//无论你传入的是什么 …

想冲宇宙厂,直接挂了。。。

宇宙厂实际是字节,这个称呼是因为字节跳动主宰了宇宙内一切App,有点家大业大的意思。 今天分享一位字节春招凉经,问了一些数据库和Java八股,没出算法题,直接挂了,竟然最喜欢出算法题的字节,这次…

【MySQL面试题pro版-8】

MySQL是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的RDBMS (Relational Database Management System,关系数据…

探究C++20协程(5)——基于挂起实现无阻塞的定时器

实现目标 当用传统的线程 sleep 函数来让程序等待时,实际上是在阻塞当前线程。阻塞意味着这个线程在指定的时间(例如100毫秒)内无法执行任何其他任务。这种方式虽然简单,但效率低下,因为它导致CPU资源在等待期间未被充…

自动驾驶时代的物联网与车载系统安全:挑战与应对策略

随着特斯拉CEO埃隆马斯克近日对未来出行景象的描绘——几乎所有汽车都将实现自动驾驶,这一愿景愈发接近现实。马斯克生动比喻,未来的乘客步入汽车就如同走进一部自动化的电梯,无需任何手动操作。这一转变预示着汽车行业正朝着高度智能化的方向…

计算机网络原原理学习资料分享笔记---第一章/第六节(为有梦想的自己加油!)

第六节 计算机网络与 因特网发展简史 第六节 计算机网络与因特网发展简史 知识点 1 计算机网络与因特网发展简史 第六节 计算机网络与因特网发展简史 3 、 1972 年底, ARPAnet已经发展到 15 个交换结点。 4 、 20 世纪 70 年代早期与中期,除了ARPAn…