赞
踩
在上手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出来的对象不能自动注入对象和属性的问题
时间有限,只能写这么多了,感觉从中又多学到了一点,遇到问题最重要的是要定位问题,找到问题的原因,这样便可以很快的解决问题。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。