2016-11-19 5 views
-3

Мне интересно знать, что разница, когда я используюРазница между сканированием сканирования = null; и Scan scan = new Scan();

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.

Итак, кто-то, пожалуйста, помогите мне узнать, почему я получаю это предупреждение. Моя программа работает нормально со вторым, но просто любопытно узнать причину предупреждения.

Заранее спасибо.

+4

'моя программа работает отлично' Я как-то сомневаюсь, что – pinkfloydx33

+0

@ pinkfloydx33 Может быть, он никогда не называет метод. – Kayaman

+0

@ розовыйfloydx33 вы r право. Я редактировал вопрос, на самом деле я имел в виду, что программа работает нормально с Scan scan = new Scan(); –

ответ

0

Разница в том, что если вы попытались запустить первую версию, ваша программа потерпит крах с NullPointerException (иначе NPE) при первом вызове scan.addColumn(...).

Когда вы вызываете метод экземпляра, вам нужен объект для вызова экземпляра. Но при инициализации scan как это:

Scan scan = null; 

вы устанавливаете его значение в null ссылки ... что означает «нет экземпляра». И когда вы затем попытаетесь вызвать метод addColumn на ссылке null, вы получите NPE.

Это то, что сообщение об ошибке компилятора пытается вам рассказать. Компилятор может видеть, что хотя ваша программа действительна Java ... она сбой при запуске.

+0

С каких пор 'null' означает _no instance_? 'null' -' null'. В контексте «Сканирование Scan = null» это означает, что «scan» не содержит экземпляр «Scan» или что-либо еще, что не ссылается на «null». – dbf

+0

@ dbf - Состояние JLS: * «Опорные значения (часто только ссылки) являются указателями на эти объекты и специальной ссылкой на нуль, которая не ссылается на объект.» *. (JLS 4.3.1) Другими словами, «null» означает экземпляр объекта/нет. –

+0

Серьезно ..Я догадался, что авторы книг Java получили это право, предположим, что я был не прав;) – dbf

0

Хотя основные основы Java, но я попытаюсь объяснить это в простой ПУТЬ

Scan scan = new Scan(); 

С выше линии, вы объявляете переменную «сканирование» типа «Scan» и в то же самое вы инициализируете его экземпляром класса «Сканировать». Итак, теперь в памяти ваш объект «scan» существует и ссылается на некоторую ячейку памяти. Итак, теперь вы можете вызывать методы на объекте «scan» и использовать его переменные и методы.

В другом заявлении -

Scan scan = null; 

Здесь вы объявили переменную «сканирование» и эта переменная сканирования инициализируется нулем. Это означает, что вы не создали экземпляр класса «Сканировать». Переменная «scan» не относится к какой-либо допустимой ячейке памяти. Поскольку этот экземпляр не создан, поэтому, если вы вызываете какой-либо метод этой переменной сканирования, вы получите NullPointerException