在使用自动装配注解的时候有时候会造成空指针异常,也就是自动装配的对象不存在或者IoC容器没有找到对应类型的类的时候就会给自动装配的对象一个null的空值,而在我们调用这个对象的时候就会报出一个空指针异常。 这个空指针异常出现的情况非常的突然且比较常见,首先我们从自动装配的基本原理开始说明
自动装配的装配方式
自动装配的类型默认是按照类型进行装配。当我们在一个类上标注@Controller或者@Service等其他将Bean注册到IoC容器中的注解时,Spring容器就会扫描到这些注解,并将创建这些Bean的示例然后存放到容器中方便我们之后的调用。 而自动装配就是当我们使用@Autowired注解标注在一个属性中时,Spring就会根据属性的类型在Spring容器中寻找对应类型的Bean并动态的赋值进去,让我们可以调动这个类。 如果属性的类型是一个接口,那么装配的类型就是这个接口的具体实现类。 根据描述,我们可以知道,自动装配的值的来源是Spring容器,而如果Spring容器中没有对应属性的Bean实例,那么就是装配失败,导致空指针异常。 那么继续延伸,容器中没有对应类型的Bean实例的原因可能是没有正确的编写注册Bean组件的标签 在我们使用注解的时候,可能会因为扫描包的路径写错而导致无法扫描注解而导致无法将类注册进IoC容器 以及一些比较特殊的情况,比如我们的test测试文件夹下做单元测试的时候,可能会用到有关于Spring容器的有关测试,会因为Test包导入的时候导错了包而导致无法正确使用对应的测试标签 以及我们在使用一些监听器的时候,比如之前我们整合监听器的时候会因为监听Spring容器的配置文件的监听类写错而导致无法正确的引入IoC容器从而无法获取到容器中的Bean实例而导致无法自动注入 这些都是一些细节上的问题,如果中间一个环节出了问题,都会导致项目无法启动。
对于错误检查的一些办法
当项目中出现了错误,我们要知道如何去排查错误,尤其是当报错信息不明显的时候,我们要知道如何去找到根本的错误原因。有一些简单的方法可以让我们快速的排查我们报错的具体代码位置
- 最常用的当然是断点调试:当我们的代码报错的时候,我们可以在代码上打一个断点,然后一步一步的运行代码,在我们运行的时候,要注意变量的赋值过程以及方法的调用是否跟我们预想的一样,如果出现了偏差,我们基本就能定位报错的位置在哪里,从而对可能出现的报错进行调整。
- 以及我们的单元测试:单元测试是我们对一部分的功能进行测试,当我们对一个独立的功能进行测试通过之后,我们再将他整合到整个的项目中去。比如我们在整合SSM的时候,我们从MyBatis开始,先测试MyBatis是否可以运行成功,然后逐渐的整合Spring,然后对IoC测试,Service层测试。再去整合SpringMVC,对浏览器的访问进行测试,然后添加Controller,最后整合成一个完整的项目。这就是最基本的单元测试。
- 最后就是看日志和报错信息:报错信息虽然有时候并不是那么的准确,但是我们也要对一些基本的报错信息有所了解,比如空指针异常的产生原因。在我们运行SpringMVC项目的时候日志的作用就比较明显,我们可以从日志中看出很多有用的消息,比如dispatchService也是我们的前端控制器是否正常的初始化并工作,我们的依赖注入是否正常的赋值对象,以及我们请求的信息,是否相应成功都会在日期中有所体现,所以查看日志也是我们需要做的。
在开始编写代码之前有一个清晰的逻辑认知比后期无脑的排错要好很多,在平时练习的时候就要养成良好的编码习惯,比如写注释,逻辑清晰,会提高我们的编码速度和规范性。