Scan scan = null;和扫描扫描=新扫描();

时间:2016-11-19 13:26:23

标签: java

我很想知道使用

时会有什么不同

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

所以,有人请帮我找出为什么我会收到这个警告,我的程序运行正常,但是,只是想知道警告背后的原因。

提前致谢。

2 个答案:

答案 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 ...但是当你运行它时会崩溃。