`
哈达f
  • 浏览: 116530 次
  • 性别: Icon_minigender_1
  • 来自: 广西
社区版块
存档分类
最新评论

工厂模式下出现的问题-null异常

    博客分类:
  • j2se
 
阅读更多

 

遇到了一个问题:

public class DaoFactory{
    private static DaoFactory instance = new DaoFactory();
    private static UserDao userDao = null;
    
    private DaoFactory(){
        try{
            Properties prp = new Properties();
            InputStream in = new FileInputStream(new File("src/dbconfig.properties"));
            prp.load(in);
            String userDaoClass = prp.getProperty("UserDaoClass");
            userDao = Class.forName(userDaoClass).newInstance();
        }catch(Exception e){
             throw new RuntimeException("类初始化有误");
        }

      public static DaoFactory getInstance(){
          return this.instance;
      }
      
      public UserDao getUserDao(){
          return this.userDao;
      }
    }
}


调用:

public class DaoFactoryTest{

     public static void main(String[] args){
          UserDao userDao = DaoFactory.getInstance().getUserDao();
          System.out.println(userDao);
     }

}

这样子调用居然会出现null指针异常。

重新分析了一下代码才发现,原来出错的地方是这样的,没有注意到代码块加载的顺序,其实是这样的 静态属性static首先被加载 
private static DaoFactory instance = new DaoFactory();
private static UserDao userDao = null;
也就是说两个静态属性都首先加载了,但是初始化是有顺序的,从上到下,先初始化第一个静态属性,instance被初始化以后,userDao也就初始化有值了,但是接着又对userDao初始化,也就是第二句,再次把userDao赋值为null,所以当我们在调用的时候,返回的就是一个空结果了。


找到问题的源头自然也就好解决问题了,我们只需要把他们顺序换一下就好了
private static UserDao userDao = null;
private static DaoFactory instance = new DaoFactory();

这样子就能正确的返回结果了。
分享到:
评论

相关推荐

    设计模式系列编程源码----简单工厂模式

    在简单工厂模式下,我们可以创建一个"ButtonFactory"工厂类,该类内有多个方法,分别负责创建不同类型的按钮对象。这样,当需要创建一个新的按钮时,只需要调用相应的工厂方法即可,无需知道按钮的具体实现细节。 ...

    php单例模式和工厂模式

    工厂模式的好处在于,客户端代码无需关心产品是如何创建的,只需知道如何使用即可,提高了代码的可维护性和可扩展性。 总结: PHP 中的单例模式主要用于限制类的实例化次数,确保全局范围内只有一个实例,常用于...

    java常用设计模式-空对象模式

    这种模式通常用于需要处理 null 对象的情况下,以避免NullPointerException 异常。 在软件设计中,我们经常会遇到需要处理 null 对象的情况,例如在数据库查询中,查询结果可能为空;在网络请求中,响应结果可能为...

    工厂综合设计模式笔记

    尽管在某些情况下可能会显得较为复杂,但在大型系统或需要频繁扩展的场景下,工厂模式的价值尤为突出。通过不断的实践和项目经验积累,开发者能够更好地理解和运用这一模式,提高软件的灵活性和可维护性。

    问题_工厂LTE综测时,设备Crash的问题1

    - **复现问题**:首先,需要在相同的环境和条件下复现这个问题,以便收集更多的信息。 - **代码审查**:对`rf_test_task.c`和`udcif.c`等相关代码进行详细审查,查找可能导致NULL指针的原因。 - **调试**:使用...

    阿里巴巴Java开发手册(终极版)

    - 常见设计模式的应用:单例模式、工厂模式、观察者模式等,提高代码的复用性和扩展性。 - SOLID原则:单一职责、开闭原则、里氏替换、接口隔离和依赖倒置,是设计模式的基础。 7. **单元测试**: - JUnit与...

    课程新浪信息系统java开发工程师测试题.pdf

    `,因为没有`agent`类型的`Order`,会抛出异常`Exception("no suitable order type")`,并在finally块中显示`created 0 order`,因为`order`是null。 - UML类结构图未给出,但根据代码,可以绘制如下: ``` +----...

    阿里巴巴Java开发手册1.4.0.rar

    - 常用设计模式如工厂模式、单例模式、观察者模式等应熟练掌握并合理应用。 - 避免过度设计,根据实际情况选择合适的设计模式。 8. **日志记录**: - 日志级别分为`TRACE`、`DEBUG`、`INFO`、`WARN`、`ERROR`,...

    Java面试技巧及问题答案.zip

    - **工厂模式**:了解简单工厂、工厂方法和抽象工厂模式。 - **代理模式**:理解静态代理和动态代理(JDK动态代理、CGLIB)。 9. **JVM** - **类加载机制**:知道双亲委派模型,以及如何自定义类加载器。 - **...

    simple_factory(第一题)_dangervm5_factory_简单工厂的实例代码_源码.zip

    简单工厂模式是软件设计模式中的一种,它提供了一种创建对象的最佳方式,特别是在当你知道所需的类,但不想或者不希望显式地指定它的类名时。这个模式属于创建型模式,其主要目的是为了隔离对象创建过程,使得客户端...

    阿里巴巴Java开发手册

    - 常用的设计模式如工厂模式、单例模式、观察者模式等,都有其特定的应用场景和注意事项。 - 避免过度设计,根据实际需求选择合适的设计模式。 9. **单元测试**: - 每个类的重要方法都应有对应的单元测试,确保...

    java面试题+答案整理

    - 设计模式是解决常见问题的模板,面试中可能涉及单例模式、工厂模式、观察者模式、装饰者模式等。 - 单例模式确保类只有一个实例,通常用在配置类、缓存管理等场景。 - 工厂模式用于创建对象,提供统一的接口,...

    Java语言编程规范--华为技术有限公司

    - 根据场景选择合适的设计模式,如工厂模式、单例模式、观察者模式等。 - 避免过度设计,保持代码简洁。 10. **单元测试** - 对关键功能编写单元测试,确保代码质量。 - 使用JUnit、Mockito等工具进行测试驱动...

    javamianshiti.rar_java面试笔试题_笔试题

    - 单例模式、工厂模式、观察者模式、装饰器模式等常见设计模式的应用与实现。 10. **Spring框架**: - AOP(面向切面编程):理解切面、通知、切入点表达式等核心概念。 - IoC(控制反转):容器管理bean的生命...

    java 机试面试题

    - 介绍常见的设计模式,如单例模式、工厂模式、装饰器模式、代理模式等。 - 设计模式在实际项目中的应用。 10. **JVM内存管理**: - 讲解堆内存、栈内存、方法区、本地方法栈和程序计数器。 - 垃圾回收机制,...

    阿里巴巴java开发文档

    - 善于运用工厂模式、代理模式、观察者模式等,提高代码的灵活性和可扩展性。 8. **代码优化**: - 避免不必要的计算和内存分配,如频繁创建对象。 - 使用`StringBuilder`进行字符串拼接,而非`+`操作。 - 使用...

    java软件技术文档,阿里巴巴Java开发手册(华山版)

    - 常用的设计模式如工厂模式、单例模式、观察者模式等,在适当场景下的应用。 - 遵循SOLID原则,提高代码的可维护性和扩展性。 9. **性能优化**: - 避免过度优化,关注代码的可读性和可维护性。 - 使用...

    c-c++常见面试题总结

    - 了解并能解释几种常见的设计模式,如工厂模式、单例模式、观察者模式等。 - 在实际问题中如何应用这些设计模式。 以上只是C++面试中可能涉及的一些主题,实际上,面试可能会深入到更具体的技术细节,如内存对齐...

Global site tag (gtag.js) - Google Analytics