使用spring开发遇到 ... nested exception is java.lang.NullPointerException] with root cause

        今天使用spring框架开发一个项目时遇到了一点小问题,同样的一个功能,取出数据库中查询到的总条数,但是在两个BizImpl中代码相似,一个通过但是另一个却报错。严重: Servlet.service() for servlet [DispatcherServlet] in context with path [/wcx] threw exception [Request processing failed; nested exception is java.lang.NullPointerException] with root cause。一开始还有点懵,以为在XML中有代码写错什么的,看到NullPointerException就是没有对变量进行null判断。其中两个不同的BizImpl类中局部代码如下:

TemplateBizImpl类中:(功能正常实现)

 

@Service
@SuppressWarnings({"rawtypes","unchecked"})
//上面的rawtypes为了消除警告(删除后BaseDao会出现警告), unchecked为了消除警告(baseDao.findAll(Template.class, map, "findByPage"  会出现警告);)。
public class TemplateBizImpl implements ITemplateBiz{
	@Autowired
	private BaseDao baseDao; 	//使用一个泛型的实体类,可以字节用它来当作数据层的类
	
	@Override
	public Map<String,Object> findByPage(Integer pageNo, Integer pageSize) {
		Map<String,Object> map = new HashMap<String,Object>();
		Map<String,Object> map1 = new HashMap<String,Object>();
		
		map.put("pageNo", pageNo);
		map.put("pageSize", pageSize);
		map1.put("total", this.baseDao.findFunc(Template.class, "temTotal").intValue());
		map1.put("rows", this.baseDao.findAll(Template.class, map, "temfindByPage"));
		return map1;
	}


SurveyBizImpl类中:(功能不能实现,报出异常)

 

 

 

@Service
@SuppressWarnings({"rawtypes","unchecked"})
public class SurveyBizImpl implements ISurveyBiz{
	private BaseDao baseDao;
	
	@Override
	public Map<String,Object> findByPage(Integer pageNo, Integer pageSize) {
		Map<String,Object> map = new HashMap<String,Object>();
		Map<String,Object> map1 = new HashMap<String,Object>();
		
		map.put("pageNo", pageNo);
		map.put("pageSize", pageSize);
		System.out.println(map);
		map1.put("total", this.baseDao.findFunc(Survey.class, "surTotal").intValue());
		System.out.println(map1);
		map1.put("rows", this.baseDao.findAll(Survey.class, map, "findByPageSurvey"));
		System.out.println(map1);
		return map1;
	}

 

这两个代码几乎都一样,一开始我一直局限在这个findByPage函数内部,报错的   map1.put("total", this.baseDao.findFunc(Survey.class, "surTotal").intValue());    没有对变量进行null判断。我们一个个对象来看。map1,就在上面定义好了,Survey这个类也导入了,最后看到一直没有关注的baseDao,仔细看也没打错,然后看了一下上面定义的。就会发现  private BaseDao baseDao;  定义的语句中上面少了  @Autowired  这个配置。因为我们使用了spring,所以相当于这个类我们给这个容器托管,不能自己随便定义。就好像学校的图书馆,我们可以去借一本书,但是不能去买一本一样的回来。所以加上 @Autowired  问题就解决了。

 

 

 

        @Autowired
	private BaseDao baseDao;


这个问题的解决办法就是在报错的那一行看每一个变量的定义的位置,看看是否存在未定义的情况,spring框架中对于对象要使用 @Autowired 配置对象。

 

 

 

 

 

 

### Spring Boot 应用程序中的 `NullPointerException` 原因分析 在 Spring Boot 应用程序中遇到 `NullPointerException` 可能由多种因素引起。通常情况下,该异常表明尝试访问未初始化的对象或变量。 当 DispatcherServlet 抛出此异常时,意味着请求处理过程中某个对象为空而被调用了方法或属性[^1]。具体原因可能涉及以下几个方面: - **依赖注入失败**:如果服务类或其他组件未能成功通过构造函数或字段完成自动装配,则可能导致其内部成员为 null。 - **配置错误**:不正确的 Bean 配置可能会阻止某些必要的实例化过程正常工作,进而造成 NPE 发生。 - **业务逻辑缺陷**:开发人员编写的代码里存在潜在漏洞,在特定条件下会返回 null 的数据结构或实体对象给控制器层。 针对上述情况可以采取如下措施来解决问题并防止未来再次发生类似的状况: #### 解决方案一:检查日志信息 查看完整的堆栈跟踪记录可以帮助定位具体的抛出处以及上下文环境。对于提到的例子而言,应当关注于 `Request processing failed; nested exception is java.lang.NullPointerException` 这样的提示语句之后的内容,从中找出确切的位置和条件。 ```bash [root@k8s-worker27-65 ~]# tail -f /path/to/logs/application.log ``` #### 解决方案二:验证依赖关系 确保所有的 @Autowired 注解都指向了已经定义好的 bean,并且这些 beans 已经按照预期的方式进行了注册和服务发现。可以通过单元测试或者集成测试的方式来确认这一点。 ```java @Autowired private MyService myService; // Ensure this service has been properly initialized before use. if (myService != null) { // Proceed with business logic... } ``` #### 解决方案三:优化业务流程控制 尽可能减少直接操作可选类型的次数;利用 Optional 类型代替原始包装器类型作为参数传递;增加更多的边界判断以应对意外输入的情况。 ```java public ResponseEntity<?> handleRequest(@RequestParam(required=false) String param){ if(param == null || param.isEmpty()){ return new ResponseEntity<>("Parameter cannot be empty", HttpStatus.BAD_REQUEST); } try{ // Process request normally here... }catch(Exception e){ logger.error(e.getMessage(),e); throw new RuntimeException("Failed to process request.",e); } } ``` #### 解决方案四:加强调试手段 启用更详细的日志级别以便更好地理解应用程序的行为模式。例如设置 DEBUG 或 TRACE 级别的输出可以在运行期间捕获更多有用的信息用于后续排查问题所在之处。 ```properties logging.level.org.springframework.web=DEBUG logging.file.name=/var/log/spring-boot-app.log ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青山孤客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值