Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это null.
Например:
string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)
if (testString.Length == 0) // Throws a nullreferenceexception
{
//Do something
}
Время выполнения .NET исключение NullReferenceException при попытке выполнить действие над чем-то, что не было инстанцировано, т.е. код выше.
По сравнению с ArgumentNullException, которое обычно выбрано как защитная мера, если метод ожидает, что то, что происходит
Дополнительная информация находится в C # NullReferenceException и Null Parameter .
private int[] data = new int[3];
Это уже инициализирует элементы массива до 0. Вам не нужно повторять это снова в конструкторе.
В вашем конструкторе это должно быть:
data = new int[]{0, 0, 0};
в вашем конструкторе вы создаете еще один массив int:
public Date(){
int[] data = {0,0,0};
}
Попробуйте это:
data = {0,0,0};
ПРИМЕЧАНИЕ. Кстати, вам НЕ нужно инициализировать элементы массива если он объявлен как переменная экземпляра. Экземпляры экземпляра автоматически получают значения по умолчанию, которые для целочисленного массива значениями по умолчанию являются все нули.
Если у вас был локально объявленный массив, хотя вам нужно было бы инициализировать каждый элемент.
Вы можете либо сделать:
public class Data {
private int[] data;
public Data() {
data = new int[]{0, 0, 0};
}
}
Что инициализирует data
в конструкторе, либо:
public class Data {
private int[] data = new int[]{0, 0, 0};
public Data() {
// data already initialised
}
}
Что инициализирует data
перед кодом в конструкторе выполняется.
почему не просто
public Date(){
data = new int[]{0,0,0};
}
причина, по которой вы получили ошибку, потому что int[] data = ...
объявляет новую переменную и скрывает поле data
, однако следует отметить что содержимое массива уже инициализировано до 0 (значение по умолчанию int
)
Лучший способ - не писать какие-либо инициализирующие утверждения. Это связано с тем, что если вы пишете int a[]=new int[3]
, то по умолчанию в Java все значения массива i.e. a[0]
, a[1]
и a[2]
инициализируются 0
! Что касается локальной переменной, скрывающей поле, отправьте весь свой код, чтобы мы пришли к выводу.
Это потому, что в конструкторе вы объявили локальную переменную с тем же именем, что и атрибут.
Чтобы выделить целочисленный массив, который все элементы инициализированы равным нулю, напишите это в конструкторе:
data = new int[3];
Чтобы выделить целочисленный массив, который имеет другие начальные значения, поместите этот код в конструкторе:
int[] temp = {2, 3, 7};
data = temp;
или:
data = new int[] {2, 3, 7};