`
哈达f
  • 浏览: 114802 次
  • 性别: 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();

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

相关推荐

    java面试800题

    factory工厂模式、prototype原始模型模式、singleton单例模式、builder建造模式 结构模式 facade门面模式、proxy代理模式、adapter适配器(变压器)模式、composite合成模式、decorator装饰模式、bridge桥梁模式、...

    JavaScript王者归来part.1 总数2

     6.5.2 模式--函数工厂及其实例   6.6 总结   第7章 对象  7.1 什么是对象   7.2 对象的属性和方法   7.2.1 对象的内置属性   7.2.2 为对象添加和删除属性   7.2.3 反射机制--枚举对象属性   7.3 ...

    Java 基础核心总结 +经典算法大全.rar

    Spring 的 IOC 容器反射 + 抽象工厂模式 JDBC 加载数据库驱动类反射的优势及缺陷 增加程序的灵活性破坏类的封装性 性能损耗 代理模式 静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的...

    超级有影响力霸气的Java面试题大全文档

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    java 面试题 总结

     GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...

    传智播客扫地僧视频讲义源码

    本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...

    Spring面试题

    核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 ☆ Spring 上下文:Spring 上下文是一个配置文件,向 ...

    【05-面向对象(下)】

    •接口与简单工厂模式、命令模式等。 内部类 •我们把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,有的也叫嵌套类,包含内  部类的类也被称为外部类有的也叫宿住类。 ...

    Python核心编程(第二版).pdf (压缩包分2部分,第二部分)

     4.3.2 none--python的null对象   4.4 内部类型   4.4.1 代码对象   4.4.2 帧对象   4.4.3 跟踪记录对象   4.4.4 切片对象   4.4.5 省略对象   4.4.6 xrange 对象   4.5 标准类型操作符 ...

    Python核心编程(第二版).pdf (压缩包分2部分,第一部分)

     4.3.2 none--python的null对象   4.4 内部类型   4.4.1 代码对象   4.4.2 帧对象   4.4.3 跟踪记录对象   4.4.4 切片对象   4.4.5 省略对象   4.4.6 xrange 对象   4.5 标准类型操作符 ...

    Python核心编程第二版(ok)

     4.3.2 None--Python的Null对象   4.4 内部类型   4.4.1 代码对象   4.4.2 帧对象   4.4.3 跟踪记录对象   4.4.4 切片对象   4.4.5 省略对象   4.4.6 XRangec对象   4.5 标准类型操作符 ...

    Python核心编程第二版

     4.3.2 None--Python的Null对象   4.4 内部类型   4.4.1 代码对象   4.4.2 帧对象   4.4.3 跟踪记录对象   4.4.4 切片对象   4.4.5 省略对象   4.4.6 XRange 对象   4.5 标准类型操作符 ...

    重构-改善既有代码的设计(中文版)

     Introduce Null Object 引入Null对象   Introduce Assertion 引入断言  Chapter 10:Making Method Calls Simpler 简化方法调用   Rename Method 重命名方法   Add Parameter 添加参数   Remove ...

    重构-改善既有代码的设计 中文版.pdf

    9.7 Introduce Null Object(引入Null对象) 9.8 Introduce Assertion(引入断言) 第10章 简化函数呼叫 10.1 Rename Method(重新命名函数) 10.2 Add Parameter(添加参数) 10.3 Remove Parameter(移除参数) ...

    Java学习笔记-个人整理的

    {12.4}关于null值}{154}{section.12.4} {12.5}操作符与实例}{154}{section.12.5} {12.5.1}where}{154}{subsection.12.5.1} {12.6}函数}{156}{section.12.6} {12.7}组函数}{158}{section.12.7} {12.7.1}group ...

    重构:改善既有代码的设计.[美]Martin Fowler.epub【文字版手机格式】

    本书也因此成为与《设计模式》齐名的经典著作,被译为中、德、俄、日等众多语言,在世界范围内畅销不衰。 本书凝聚了软件开发社区专家多年摸索而获得的宝贵经验,拥有不因时光流逝而磨灭的价值。今天,无论是重构...

    《重构改善既有代码的设计(2010年版)》(Martin Fowler[美] 著,熊节 译)

    本书也因此成为与《设计模式》齐名的经典著作,被译为中、德、俄、日等众多语言,在世界范围内畅销不衰。 本书凝聚了软件开发社区专家多年摸索而获得的宝贵经验,拥有不因时光流逝而磨灭的价值。今天,无论是重构...

    千方百计笔试题大全

    104、说下Struts的设计模式 24 105、spring工作机制及为什么要用? 24 106、HttpSession session = request.getSession() 24 107、getParameter与 getAttribute的区别? 24 108、以下哪一个不是赋值符号? 25 109、...

Global site tag (gtag.js) - Google Analytics