我有一个实现接口CommonDaoImpl
的类CommonDao
。现在,我正尝试通过getRegisterData()
接口访问CommonDaoImpl
CommonDao
这样的参考
public class CommonServiceImpl implements CommonService
{
CommonDao commonDao
public boolean insertRegisterData(CommonBean objCommonBean) {
return commonDao.getRegisterData(objCommonBean);
}
但它不起作用并且发生了NullPointerException
所以我稍微改变了我的代码并使用实现类CommonDao impl的构造函数初始化接口引用,如下所示
public class CommonServiceImpl implements CommonService
{
CommonDao commonDao=new CommonDaoImpl();
public boolean getRegisterData(CommonBean objCommonBean) {
return commonDao.insertRegisterData(objCommonBean);
}
但我无法理解为什么会这样。
答案 0 :(得分:3)
在第一种情况下
CommonDao commonDao
它是您的类的成员字段,未初始化且默认值为null
,因此null
上的调用方法会导致NullPointerException
在你的第二个案例中,你正在初始化它
CommonDao commonDao=new CommonDaoImpl();
答案 1 :(得分:1)
为什么会发生什么?空指针异常?它发生了,因为一旦您实例化CommonServiceImpl,所有字段都会收到默认值。 commonDao是一个默认值为null的字段。
答案 2 :(得分:0)
这是因为您需要CommonDao
的实例来调用insertRegisterData
方法。语句commonDao=new CommonDaoImpl()
创建一个调用构造函数的实例并将其分配给commonDao
,因此它不再是null
。
答案 3 :(得分:0)
第一个commonDao是参考到已实施的类
Sicne commonDao是一个界面,它没有实现任何方法
CommonDao commonDao
commonDao没有引用实现接口的初始化对象,所以当你调用commonDao.insertRegisterData(objCommonBean)时; comonDao为Null,因为当前没有为它分配内存地址,并且它抛出NullException(参见图表)
CommonDao commonDao = new CommonDaoImpl(); < ---这在这里初始化
现在,commonDao正在引用一个实现接口的初始化对象。所以当你调用commonDao.insertRegisterData(objCommonBean)时,comonDao接口。 commonDao有一个分配给它的地址,这是一个初始化的类。所以现在有一个现有的参考对象有该方法。