遇到了一个问题:
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 中的单例模式主要用于限制类的实例化次数,确保全局范围内只有一个实例,常用于...
这种模式通常用于需要处理 null 对象的情况下,以避免NullPointerException 异常。 在软件设计中,我们经常会遇到需要处理 null 对象的情况,例如在数据库查询中,查询结果可能为空;在网络请求中,响应结果可能为...
尽管在某些情况下可能会显得较为复杂,但在大型系统或需要频繁扩展的场景下,工厂模式的价值尤为突出。通过不断的实践和项目经验积累,开发者能够更好地理解和运用这一模式,提高软件的灵活性和可维护性。
- **复现问题**:首先,需要在相同的环境和条件下复现这个问题,以便收集更多的信息。 - **代码审查**:对`rf_test_task.c`和`udcif.c`等相关代码进行详细审查,查找可能导致NULL指针的原因。 - **调试**:使用...
- 常见设计模式的应用:单例模式、工厂模式、观察者模式等,提高代码的复用性和扩展性。 - SOLID原则:单一职责、开闭原则、里氏替换、接口隔离和依赖倒置,是设计模式的基础。 7. **单元测试**: - JUnit与...
`,因为没有`agent`类型的`Order`,会抛出异常`Exception("no suitable order type")`,并在finally块中显示`created 0 order`,因为`order`是null。 - UML类结构图未给出,但根据代码,可以绘制如下: ``` +----...
- 常用设计模式如工厂模式、单例模式、观察者模式等应熟练掌握并合理应用。 - 避免过度设计,根据实际情况选择合适的设计模式。 8. **日志记录**: - 日志级别分为`TRACE`、`DEBUG`、`INFO`、`WARN`、`ERROR`,...
- **工厂模式**:了解简单工厂、工厂方法和抽象工厂模式。 - **代理模式**:理解静态代理和动态代理(JDK动态代理、CGLIB)。 9. **JVM** - **类加载机制**:知道双亲委派模型,以及如何自定义类加载器。 - **...
简单工厂模式是软件设计模式中的一种,它提供了一种创建对象的最佳方式,特别是在当你知道所需的类,但不想或者不希望显式地指定它的类名时。这个模式属于创建型模式,其主要目的是为了隔离对象创建过程,使得客户端...
- 常用的设计模式如工厂模式、单例模式、观察者模式等,都有其特定的应用场景和注意事项。 - 避免过度设计,根据实际需求选择合适的设计模式。 9. **单元测试**: - 每个类的重要方法都应有对应的单元测试,确保...
- 设计模式是解决常见问题的模板,面试中可能涉及单例模式、工厂模式、观察者模式、装饰者模式等。 - 单例模式确保类只有一个实例,通常用在配置类、缓存管理等场景。 - 工厂模式用于创建对象,提供统一的接口,...
- 根据场景选择合适的设计模式,如工厂模式、单例模式、观察者模式等。 - 避免过度设计,保持代码简洁。 10. **单元测试** - 对关键功能编写单元测试,确保代码质量。 - 使用JUnit、Mockito等工具进行测试驱动...
- 单例模式、工厂模式、观察者模式、装饰器模式等常见设计模式的应用与实现。 10. **Spring框架**: - AOP(面向切面编程):理解切面、通知、切入点表达式等核心概念。 - IoC(控制反转):容器管理bean的生命...
- 介绍常见的设计模式,如单例模式、工厂模式、装饰器模式、代理模式等。 - 设计模式在实际项目中的应用。 10. **JVM内存管理**: - 讲解堆内存、栈内存、方法区、本地方法栈和程序计数器。 - 垃圾回收机制,...
- 善于运用工厂模式、代理模式、观察者模式等,提高代码的灵活性和可扩展性。 8. **代码优化**: - 避免不必要的计算和内存分配,如频繁创建对象。 - 使用`StringBuilder`进行字符串拼接,而非`+`操作。 - 使用...
- 常用的设计模式如工厂模式、单例模式、观察者模式等,在适当场景下的应用。 - 遵循SOLID原则,提高代码的可维护性和扩展性。 9. **性能优化**: - 避免过度优化,关注代码的可读性和可维护性。 - 使用...
- 了解并能解释几种常见的设计模式,如工厂模式、单例模式、观察者模式等。 - 在实际问题中如何应用这些设计模式。 以上只是C++面试中可能涉及的一些主题,实际上,面试可能会深入到更具体的技术细节,如内存对齐...