我很想知道使用
时会有什么不同 Scan scan = new Scan();
代替Scan scan = null;
public Scan getScanByColumn1(byte[] columnFamily,Map<String,String> columnMap){
Scan scan = null;
scan.addColumn(columnFamily, ForesightConstants.QUALIFIER_SOFTWARE_VERSION);
scan.addColumn(columnFamily, ForesightConstants.QUALIFIER_CNUM);
scan.addColumn(columnFamily, ForesightConstants.QUALIFIER_SID);
scan.addColumn(columnFamily, ForesightConstants.QUALIFIER_HIERARCHY);
return scan;
}
public Scan getScanByColumn2(byte[] columnFamily,Map<String,String> columnMap){
Scan scan = new Scan();
scan.addColumn(columnFamily, ForesightConstants.QUALIFIER_SOFTWARE_VERSION);
scan.addColumn(columnFamily, ForesightConstants.QUALIFIER_CNUM);
scan.addColumn(columnFamily, ForesightConstants.QUALIFIER_SID);
scan.addColumn(columnFamily, ForesightConstants.QUALIFIER_HIERARCHY);
return scan;
}
当我使用Scan scan = null;
时,当我向扫描对象添加第一列时,它会发出警告。警告是Null pointer access: The variable scan can only be null at this location
。
所以,有人请帮我找出为什么我会收到这个警告,我的程序运行正常,但是,只是想知道警告背后的原因。
提前致谢。
答案 0 :(得分:0)
虽然它是基本的java基础知识,但我会尝试以简单的方式解释它 -
Scan scan = new Scan();
使用上面的行,您将声明“扫描”类型的变量“扫描”,同时使用“扫描”类的实例初始化它。因此,现在在内存中,您的“扫描”对象存在并引用一些内存位置。所以,现在你可以在'scan'对象上调用方法并使用它的变量和方法。
在另一个声明中 -
Scan scan = null;
这里你声明了一个变量'scan',这个scan变量用null初始化。这意味着您尚未创建“扫描”类的实例。 'scan'变量不引用任何有效的内存位置。因为没有创建这个实例,所以如果你在这个'scan'变量上调用任何方法,你将得到NullPointerException
答案 1 :(得分:0)
不同之处在于,如果您尝试运行第一个版本,则在第一次NullPointerException
调用时,您的程序会因scan.addColumn(...)
(又称NPE)而崩溃。
调用实例方法时,需要一个对象来调用实例。但是当你像这样初始化scan
时:
Scan scan = null;
您将其值设置为null
引用...这意味着&#34;没有实例&#34;。然后,当您尝试在addColumn
引用上调用null
方法时,您将获得一个NPE。
这就是编译器错误消息试图告诉您的内容。编译器可以看到虽然你的程序是有效的Java ...但是当你运行它时会崩溃。