`

java陷阱--------神奇的初始化

    博客分类:
  • J2SE
阅读更多

public class DaoFactory{
  private static DaoFactory instance = new DaoFactory();
  private static UserDao userDao = null;
  
  private DaoFactory(){
    try{
     Properties prop = new Properties();
     InputStream inStream = new FileInputStream(new File("src/daoconfig.properties"));
     prop.load(inStream);
     String userDaoClass = prop.getProperty("userDaoClass");
     Class clazz = Class.forName(userDaoClass);
     userDao = (UserDao)clazz.newInstance();
     System.out.println(userDao);
    }catch(Throwable e){
      throw new ExceptionIninitiallizerError(e);
    }
  }
  
  public static DaoFactory getInstance(){
    return instance;
  }
  
  public static UserDao getUserDao(){
  System.out.println(userDao);
    return userDao;
  }

} 

下面我们调用这段代码:
DaoFactory.getInstance().getUserDao();


//注意:报错了哈


原因。。。。
1。执行:
private static DaoFactory instance = new DaoFactory();

2。在静态方法里面,也就是一加载到JVM的时候就执行构造函数
所以private DaoFactory(){
    try{
     Properties prop = new Properties();
     InputStream inStream = new FileInputStream(new File("src/daoconfig.properties"));
     prop.load(inStream);
     String userDaoClass = prop.getProperty("userDaoClass");
     Class clazz = Class.forName(userDaoClass);
     userDao = (UserDao)clazz.newInstance();
     System.out.println(userDao);
    }catch(Throwable e){
      throw new ExceptionIninitiallizerError(e);
    }
  }
被执行,并且我们能看到userDao 被赋值了,

3。private static UserDao userDao = null;
在userDao被赋值之后,他又被赋值为空了。。。


如何改呢。。?
 private static UserDao userDao = null;
private static DaoFactory instance = new DaoFactory();
换顺序。。也就是说把所有的准备工作都做好之后再去new 他
 


分享到:
评论

相关推荐

    java面试题-类的初始化顺序.doc

    在面试中,面试官可能会通过这种类型的题目来评估应聘者对Java内存模型的理解,以及他们在编写代码时是否能考虑到这些初始化规则,从而避免潜在的陷阱。因此,掌握类的初始化顺序是每个Java开发者必备的知识点。

    mysql-connector-java-5.1.7-bin.zip

    3. **初始化连接池**:通过`ComboPooledDataSource`类初始化连接池,并设置数据库连接信息。 4. **获取和归还连接**:使用`getConnection()`方法从连接池获取连接,使用完毕后,调用`close()`方法归还连接回池,而...

    aip-java-sdk-4.1.0.zip )

    《基于OCR技术的图片文字识别——深度解析百度aip-java-sdk-4.1.0》 在当今数字化时代,图像中的文字识别(OCR,Optical Character Recognition)技术扮演着至关重要的角色,它使得计算机能够自动识别并转换图像中...

    aliyun-java-sdk-dysmsapi.zip

    这个压缩包“aliyun-java-sdk-dysmsapi.zip”包含了所有必要的类库和资源,以便在Java环境中使用阿里云的短信接口。 1. **DYSMSAPI介绍**: 阿里云DYSMSAPI(Dynamic SMS API)是阿里云提供的高可用、高稳定性的...

    onvif-java-lib-master.rar

    接下来,他们可以参考库提供的API文档或者示例代码,学习如何初始化ONVIF客户端,执行设备发现,连接到特定设备,以及执行各种ONVIF操作。 在开发过程中,需要注意的是,ONVIF设备的响应速度可能因网络状况和设备...

    aliyun-java-sdk-core-4.1.0.jar 阿里大于短信发送的依赖包

    1. **初始化客户端**:使用AccessKey和AccessKeySecret创建DefaultAcsClient实例。 2. **构建请求**:创建SendSmsRequest对象,设置短信接收号码、模板代码和模板参数。 3. **发送请求**:通过客户端调用sendSms...

    ckeditor-java-core-3.5.3

    在"ckeditor-java-core-3.5.3"压缩包中,通常会包含CKEditor的Java API接口文档,这些接口允许开发者控制编辑器的行为,如初始化编辑器、设置和获取编辑器内容、处理用户事件等。此外,还可能有CKEditor的核心...

    mysql-connector-java-8.0.20.jar

    连接池预先初始化一定数量的连接,并在需要时提供给应用程序,用完后归还,避免了频繁创建和关闭连接的开销。 此外,`mysql-connector-java-8.0.20.jar`还支持多种配置选项,例如设置超时、SSL连接、字符集、事务...

    使用wx-java-miniapp-spring-boot-starter开发的微信小程序演示demo.zip

    爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的...

    java编程思想-初始化与清理

    java编程思想-初始化与清理了解this之后,你就能更全面地理解“静态(static)方法”的含义。静态方法就是没有this的方法。在“静态方法”的内部不能调用“非静态方法”,反过来倒是可以的。而且你可以在没有创建...

    aip-java-sdk-4.9.0

    例如,使用AipOcr类来调用文字识别服务,初始化客户端需要提供应用ID、API密钥和超时设置等参数。之后,可以调用特定的方法如basicGeneral()或advancedGeneral()来进行通用文字识别或复杂场景的文字识别。 在实际...

    S7-300初始化的方法.doc

    S7-300 初始化的方法 S7-300 是一种高性能的可编程逻辑控制器(PLC),广泛应用于工业自动化领域。为了确保 S7-300 的正常运行,初始化是必不可少的一步。本文将详细介绍 S7-300 初始化的方法,包括微存储卡 MMC 的...

    aliyun-java-vod-upload-1.4.14

    9. **集成示例**:使用这个SDK时,开发者通常需要参考官方文档或示例代码来学习如何初始化客户端、配置访问权限、调用API等功能。 10. **错误处理和调试**:SDK会提供丰富的错误处理机制,帮助开发者诊断和解决问题...

    yop-java-sdk-2.1.4.zip

    在本案例中,我们关注的是其Java SDK的版本2.1.4,即"yop-java-sdk-2.1.4.zip"。这个压缩包包含了开发人员在Java环境中集成易宝支付功能所需的所有组件和示例代码。 首先,让我们深入理解易宝支付SDK的核心概念: ...

    fastdfs-client-java-1.27-SNAPSHOT.zip

    2. **初始化连接**:启动程序时,初始化FastDFS客户端,建立与Tracker Server的连接。 3. **文件上传**:通过客户端API将本地文件上传至FastDFS系统,上传过程中,FastDFS会自动进行负载均衡和文件复制,确保高可用...

    Jenkins安装包,可直接使用 java -jar jenkins.war --httpPort=8080启动

    Jenkins安装包,可直接使用 java -jar jenkins.war --httpPort=8080启动

    C3P0连接池jar包,mysql-connector-java-5.1.37,druid连接池jar包,commons-dbu

    配置C3P0时,开发者可以通过调整各种参数来优化性能,如初始化连接数、最大连接数、超时时间等。 接下来是MySQL的JDBC驱动,即mysql-connector-java-5.1.37。这是MySQL官方提供的用于Java应用程序与MySQL数据库进行...

    esdk-obs-java-3.20.3.zip

    《华为OBS SDK详解——基于esdk-obs-java-3.20.3.zip的实践指南》 在当今数字化时代,云存储服务已经成为企业和个人存储大量非结构化数据的重要工具。华为的对象存储服务(Object Storage Service,简称OBS)正是...

    基于java的-39-12-五台山景点购票系统-源码.zip

    \ssmukwx2\db\`:这个目录可能包含了项目的数据库脚本,比如创建表、初始化数据等。 - `??java?-39-12-?????????-??\ssmukwx2\src\`:源代码根目录,包含了项目的所有源码文件。 - `??java?-39-12-?????????-??\...

    基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip

    基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-ejbCreate函数用于初始化一个EJB实例.zip 基于java的开发源码-...

Global site tag (gtag.js) - Google Analytics