遇到了一个问题:
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();
这样子就能正确的返回结果了。
分享到:
相关推荐
factory工厂模式、prototype原始模型模式、singleton单例模式、builder建造模式 结构模式 facade门面模式、proxy代理模式、adapter适配器(变压器)模式、composite合成模式、decorator装饰模式、bridge桥梁模式、...
6.5.2 模式--函数工厂及其实例 6.6 总结 第7章 对象 7.1 什么是对象 7.2 对象的属性和方法 7.2.1 对象的内置属性 7.2.2 为对象添加和删除属性 7.2.3 反射机制--枚举对象属性 7.3 ...
Spring 的 IOC 容器反射 + 抽象工厂模式 JDBC 加载数据库驱动类反射的优势及缺陷 增加程序的灵活性破坏类的封装性 性能损耗 代理模式 静态代理与动态代理常见的动态代理实现JDK Proxy CGLIB JDK Proxy 和 CGLIB 的...
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
本教程共分为5个部分,第一部分是C语言提高部分,第二部分为C++基础部分,第三部分为C++进阶部分,第四部分为C、C++及数据结构基础部分,第五部分为C_C++与设计模式基础,内容非常详细. 第一部分 C语言提高部分目录...
核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。 ☆ Spring 上下文:Spring 上下文是一个配置文件,向 ...
•接口与简单工厂模式、命令模式等。 内部类 •我们把一个类放在另一个类的内部定义,这个定义在其他类内部的类就被称为内部类,有的也叫嵌套类,包含内 部类的类也被称为外部类有的也叫宿住类。 ...
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 标准类型操作符 ...
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 标准类型操作符 ...
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 标准类型操作符 ...
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 ...
9.7 Introduce Null Object(引入Null对象) 9.8 Introduce Assertion(引入断言) 第10章 简化函数呼叫 10.1 Rename Method(重新命名函数) 10.2 Add Parameter(添加参数) 10.3 Remove Parameter(移除参数) ...
{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 ...
本书也因此成为与《设计模式》齐名的经典著作,被译为中、德、俄、日等众多语言,在世界范围内畅销不衰。 本书凝聚了软件开发社区专家多年摸索而获得的宝贵经验,拥有不因时光流逝而磨灭的价值。今天,无论是重构...
本书也因此成为与《设计模式》齐名的经典著作,被译为中、德、俄、日等众多语言,在世界范围内畅销不衰。 本书凝聚了软件开发社区专家多年摸索而获得的宝贵经验,拥有不因时光流逝而磨灭的价值。今天,无论是重构...
104、说下Struts的设计模式 24 105、spring工作机制及为什么要用? 24 106、HttpSession session = request.getSession() 24 107、getParameter与 getAttribute的区别? 24 108、以下哪一个不是赋值符号? 25 109、...