Анализатор обнаружил в конструкторе класса обращение к полю, которое ещё не было инициализировано.
Все поля в Java неявно инициализируются значениями по умолчанию соответствующих типов. Для ссылочных типов этим значением является 'null'.
Рассмотрим пример подобной ошибки:
public class Test
{
private Object data;
private DataProvider dataProvider;
public Test(DataProvider provider)
{
this.data = dataProvider.get();
this.dataProvider = dataProvider;
}
}
Здесь производится обращение к полю класса, а не параметру конструктора, из-за чего возникает 'NullPointerException' при каждом вызове этого конструктора. Исправленный вариант:
public class Test
{
private Object data;
private DataProvider dataProvider;
public Test(DataProvider provider)
{
this.data = provider.get();
this.dataProvider = provider;
}
}
Другой ошибкой, связанной с использованием неинициализированных ссылочных полей, является их сравнение с 'null'. В этом случае условия являются всегда истинными или всегда ложными, что показывает ошибку в построении логики программы.
public class Test
{
private DataProvider dataProvider;
public Test()
{
if (dataProvider != null)
{
dataProvider = new DataProvider();
}
}
}
Анализатор не будет выдавать данное предупреждение, если поле было явно проинициализировано. В том числе, и значением 'null'.
Данная диагностика классифицируется как:
Взгляните на примеры ошибок, обнаруженных с помощью диагностики V6090. |