美文网首页
踩过的小坑

踩过的小坑

作者: clicsug | 来源:发表于2019-11-12 20:48 被阅读0次

前几天上了个小需求,出现了一个空指针的bug
项目中有个抽象基类 abstractBase 里面有很多私有的bean,这个基类有多个实现类ClassA,ClassB等等,其中ClassA中也有跟基类同名的私有属性bean,并且实现了get、set方法,结果导致在基类中用这个bean时报了空指针。
例如:
抽象基类:BaseRepaireService

public abstract class BaseRepaireService implements RepaireService{
    private InvoiceService invoiceService;
    private String title;

    public abstract void print();
    public void invoice(){
        print();
        invoiceService.makeInvoice("维修发票");
    }
    public InvoiceService getInvoiceService() {
        return invoiceService;
    }
    public void setInvoiceService(InvoiceService invoiceService) {
        this.invoiceService = invoiceService;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}

具体实现类:OfsRepaireServiceImpl

public class OfsRepaireServiceImpl extends BaseRepaireService {
    
    private InvoiceService invoiceService;
    @Override
    public void print() {
        invoiceService.makeInvoice("外单维修");
    }
    @Override
    public void makeRepaireInvoice(){
        super.invoice();
    }
    @Override
    public InvoiceService getInvoiceService() {
        return invoiceService;
    }
    @Override
    public void setInvoiceService(InvoiceService invoiceService) {
        this.invoiceService = invoiceService;
    }
}

配置文件:

    <bean id="ofsRepaireService" class="com.xc.service.impl.OfsRepaireServiceImpl"/>
    <bean id="invoiceService" class="com.xc.service.impl.InvoiceServiceImpl"/>

测试方法:

    @Test
    public void repaireServiceTest(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        RepaireService ofsRepaireService = (RepaireService) context.getBean("ofsRepaireService");
        ofsRepaireService.makeRepaireInvoice();
    }

运行测试方法 报错:
java.lang.NullPointerException
at com.xc.service.BaseRepaireService.invoice(BaseRepaireService.java:17)
at com.xc.service.impl.OfsRepaireServiceImpl.makeRepaireInvoice(OfsRepaireServiceImpl.java:19)
at SrpingParentClassTest.repaireServiceTest(SrpingParentClassTest.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
在执行基类的 invoiceService.makeInvoice("维修发票"); 语句是抛出的空指针
因为子类重写了基类的get set方法,spring在注入属性的时候实际上是将invoiceService注入到了子类的属性上 而非父类的属性上,所以父类执行时会爆出空指针
可以改成子类里面不重写父类的get set方法 直接调用父类的方法执行:

public class OfsRepaireServiceImpl extends BaseRepaireService {

    private InvoiceService invoiceService;
    @Override
    public void print() {
        super.getInvoiceService().makeInvoice("外单维修");
    }

    @Override
    public void makeRepaireInvoice(){
        super.invoice();
    }

//    @Override
//    public InvoiceService getInvoiceService() {
//        return invoiceService;
//    }
//
//    @Override
//    public void setInvoiceService(InvoiceService invoiceService) {
//        this.invoiceService = invoiceService;
//    }
}

或者不修改子类而是将基类中的属性用@Resource注解:

public abstract class BaseRepaireService implements RepaireService{

    @Resource
    private InvoiceService invoiceService;

    private String title;

    public abstract void print();
    public void invoice(){
        print();
        invoiceService.makeInvoice("维修发票");
    }
    public InvoiceService getInvoiceService() {
        return invoiceService;
    }
    public void setInvoiceService(InvoiceService invoiceService) {
        this.invoiceService = invoiceService;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
}

相关文章

  • 踩过的小坑

    前几天上了个小需求,出现了一个空指针的bug项目中有个抽象基类 abstractBase 里面有很多私有的bean...

  • 交互设计师所要避免的几个坑

    前言 工作中难免会踩到几个坑,即使现在不踩以后还会踩,只有踩过才会深刻记住,踩过说明爱过!但是踩过的坑必须把坑填满...

  • vue踩过的坑

    vue踩过的坑

  • D1094:踩坑的价值最大化

    是人就会踩坑,不踩坑理论上就不属于人类,踩坑是人之常情,能回头站在坑边反思,才是对踩过的的坑价值最大化的体现,要不...

  • Jenkins上踩过的那些坑

    在学习搭建Jenkins CI环境时踩过许多大坑小坑,记录了一些下来,以作备忘有些坑踩完就忘了,只记录下记得的后续...

  • 投资避坑指南

    2022年9月14日(第224天) 经常反思踩过的坑,犯过的错,了解别人踩过的坑,犯过的错,思考如何避免自己下次踩...

  • PHP中的数据类型

    一说到数据类型,这个坑就太多了,多到有哪些坑,有多少坑,不知道自己还会踩哪些坑,以及踩过的坑还会不会再踩,我对...

  • 踩过的坑

    1、关于Windows下修改hosts文件无法生效,刚开始直接用浏览器打开发现404,后来ping域名才发现是连接...

  • 踩过的坑

    问题: 虚拟机中一打开metasploit就死机。 答: 发现虚拟机分配内存512M。分配2G后,正常。 问题: ...

  • 踩过的坑

    虚拟机/远程桌面实验室1&7:VNC远程桌面实验室2~6:VM虚拟机 VM虚拟机连接成功后不显示虚拟机资源库方法:...

网友评论

      本文标题:踩过的小坑

      本文链接:https://www.haomeiwen.com/subject/wfmqictx.html