栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

工厂模式创建单例对象时空指针异常

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

工厂模式创建单例对象时空指针异常

工厂模式创建单例对象时空指针异常

错误描述:
首先这是我的工厂类:

public class BeanFactory {
    //定义一个Properities对象
    private static Properties props;

    //定义一个Map,用于存放我们要创建的对象,我们把它称为容器
    private static Map beans;

    //使用静态代码块为Properities赋值
    static{
        try{
        //实例化对象
        props=new Properties();
        //获取Properities文件的流对象
        InputStream in=BeanFactory.class.getClassLoader().getResourceAsStream("bean.properties");
        props.load(in);
        //实例化容器
        beans=new HashMap();
        //取出配置文件中所有的key
        Enumeration keys=props.keys();
        //遍历枚举
            while (keys.hasMoreElements())
            {
                //取出每个key
                String key= keys.nextElement().toString();
                //根据key获取value
                String beanPath= props.getProperty(key);
                //反射创建对象
                Object value = Class.forName(beanPath).newInstance();
                //把key和value存入容器中
                beans.put(key,value);
            }
        }
        catch(Exception e)
        {
            throw new ExceptionInInitializerError("初始化properties文件失败");
        }
    }
        
        public static Object getBean(String beanName)
        {
            return beans.get(beanName);            
        }
}
 

这是我的持久层接口:

public interface IAccountDao {
    void saveAccount();
}

持久层实现类:

public class AccountDaoImpl implements IAccountDao {
    public void saveAccount()
    {
        System.out.println("已经保存了账户");
    }

业务层接口:

public interface IAccountService {
    
    void saveAccount();
}

业务层实现类:

```css
public class AccountServiceImpl implements IAccountService
{
    //private IAccountDao accountDao=new AccountDaoImpl();
    IAccountDao accountDao= (IAccountDao) BeanFactory.getBean("accountDao");
    public void saveAccount(){
        accountDao.saveAccount();
    }
}

测试类

public class Client {
    public static void main(String[] args)
    {
        //IAccountService accountService=new AccountServiceImpl();
        IAccountService as= (IAccountService)BeanFactory.getBean("accountService");
        as.saveAccount();
    }
}

配置bean.properties文件:

accountService=com.wwh.service.impl.AccountServiceImpl
accountDao=com.wwh.dao.impl.AccountDaoImpl

运行报错,空指针异常:

原因:
使用Class.forName()时候, java会自动初始化要加载的类, 在上述例子中,要生产的类BeanFactory中恰好用用到了工厂类Class.forName(beanPath),要生产的对象在类初始化中恰好也用到工厂类:IAccountDao accountDao= (IAccountDao) BeanFactory.getBean(“accountDao”);
导致抛出空指针异常:NullPointerException异常

解决方法
将变量赋值放在方法中,这样生产的对象所在类在初始化时不会用到工厂类:

public class AccountServiceImpl implements IAccountService
{
    //private IAccountDao accountDao=new AccountDaoImpl();
    IAccountDao accountDao= null;
    public void saveAccount(){
        accountDao=(IAccountDao) BeanFactory.getBean("accountDao");
        accountDao.saveAccount();
    }
}

成功运行截图:

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号