当前位置:   article > 正文

Springboot项目中遇到的NullPointException_springboot nullpointerexception

springboot nullpointerexception

在上手springboot项目的时候遇到一个NullPointException,作为java新手遇到这个问题是非常常见也是比较容易解决的,但是在Springboot中遇到NullException并且是改别人的代码就确实令人头疼。
问题:
springboot中遇到的NullPointException
解决:
通过日志定位到具体的哪一行出现的空指针异常,这里是204行出现的,然后我们可以看到这一行的代码
在这里插入图片描述
从上图代码中看到第204行到205行只有涉及到hdfsMergeJobDAO和hdfsMergeJobRequest两个对象的使用,而hdfsMergeJobRequest从上面可以看出是直接new出来的,所以不可能出现NullPointException,那么出现异常的就是hdfsMergeJobDAO这个持久层对象了。
我们知道mybatis的面向接口编程是通过动态代理来实现的,按理来说也不可能出现这个空指针异常,如果有问题的话在项目启动的时候就会被检测到并且会启动失败。纠结了很久,最后定位到hdfsMergeJobDAO出现的地方。
在这里插入图片描述
hdfsMergeJobDAO这个对象是在类HdfsAutoScanMergeFolderManager中定义的,并且使用了@Autowired注解,那么为什么会出现NullPointException异常呢?如果此处有问题,比如有多个hdfsMergeJobDAO的对象一定会出现异常提示开发人员。
最后我定位到项目中是如何使用HdfsAutoScanMergeFolderManager这个类的,HdfsAutoScanMergeFolderManager hdfsAutoScanMergeFolderManager = new HdfsAutoScanMergeFolderManager();
跟踪代码可以看到是直接new 了一个HdfsAutoScanMergeFolderManager 对象然后使用其内部的hdfsMergeJobDAO成员变量,从而出现的NullPointException。如果不是用new的话,采用@Autowired来使用HdfsAutoScanMergeFolderManager 就不会出现这个问题,那么原因是什么呢?

原因:
通过阅读源码我们可以知道,在启动spring(springboot)后,spring会将所有注解过的类加载容器内,并返回 给ApplicationContextAware,在其他注解后的类需要对象时,容器会自动注入,但是自己new的类确不会被容器注入,所以在直接new 出来的HdfsAutoScanMergeFolderManager 中使用hdfsMergeJobDAO对象就会出现空指针异常。除了上面提到的采用@Autowired来使用HdfsAutoScanMergeFolderManager 对象自动注入成员变量,避免成员变量出现空指针异常,那么还有别的什么办法来解决直接new 出来的对象的成员变量出现空指针的异常呢?大家可以参考一下这个博客解决SpringBoot中自己new出来的对象不能自动注入对象和属性的问题

时间有限,只能写这么多了,感觉从中又多学到了一点,遇到问题最重要的是要定位问题,找到问题的原因,这样便可以很快的解决问题。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/955798
推荐阅读
相关标签
  

闽ICP备14008679号