Java - Пользовательский тип, вложенный в класс - PullRequest
0 голосов
/ 16 марта 2020

Я снова прошу техническую поддержку.

Мне нужно определить собственный класс внутри класса, я сделал это так:

public class MainClass {
    private class CustomType {
        public byte[] varA;
        public int varB;

        public CustomType() {
            varA = new byte[3];   
            varB = 13;
        }
    }

    private CustomType[] myArray;


    public MainClass() {
        myArray = new CustomType[1024]
        System.out.println(this.CustomType[0].varB);
    }
}

Когда я запускаю его выдает NullPointerException в System.out.println(this.CustomType[0].varB);

. Я проверил, правильно ли инициализируется myArray с 1024 элементами, и, тем не менее, я не могу получить к ним доступ.

Я только что переместился с C ++ на Java, так что я все еще привыкаю к ​​этому, я что-то упустил?

Ответы [ 5 ]

2 голосов
/ 16 марта 2020

Вы только создаете массив без каких-либо объектов, поэтому this.CustomType [0] имеет значение null.

Вы должны добавить объекты в массив:

public MainClass() {
    myArray = new CustomType[1024]
    for (int i =0; i<myArray.length;i++ {
      myArray[i] = new CustomType();
    }
    System.out.println(this.myArray[0].varB);
}

Также вы должны сделать член CustomType приватный и доступ к нему через геттер и сеттер.

1 голос
/ 16 марта 2020

Массивы в java являются объектами. Следующая строка кода, который вы разместили, создает массив из 1024 элементов, каждый из которых имеет значение null.

myArray = new CustomType[1024];

Если вы хотите поместить фактические объекты в массив с именем myArray, вам необходимо создайте экземпляры класса CustomType и назначьте их элементам массива, например:

CustomType instance = new CustomType();
myArray[0] = instance;

Тогда вы можете выполнить следующую строку кода, и она не будет выбрасывать NullPointerException.

System.out.println(myArray[0].varB);
1 голос
/ 16 марта 2020

Две вещи,

  • Вы должны создать экземпляр CustomType.
  • CustomType не требуется доступ к MainClass.this, поэтому вы можете сделать его статическим c.

То есть

public class MainClass {
    private static class CustomType {
        public byte[] varA;
        public int varB;

        public CustomType() {
            varA = new byte[3];   
            varB = 13;
        }
    }

    private CustomType[] myArray;


    public MainClass() {
        myArray = new CustomType[1024];
        for (int i = 0; i < myArray.length; ++i) {
            this.CustomType[i] = new CustomType();
        }
        // Or
        Arrays.setAll(myArray, CustomType::new);
        System.out.println(this.CustomType[0].varB);
    }
}

Не делая это c сохраняет MainClass.this в каждом CustomType экземпляре, что является ненужными накладными расходами.

0 голосов
/ 16 марта 2020

Решение состоит в том, чтобы добавить некоторые элементы в этот массив. См. Ниже шаги для получения дополнительной информации.

  1. конструктор будет вызван, когда вы создаете объект этого класса

  2. И затем вы создали пустой массив CustomType размером 1024, пытающийся получить доступ к первому несуществующему элементу (по умолчанию null) и пытающийся выполнить операции с этой нулевой ссылкой. Итак, вы получаете исключение NullPointerException.

0 голосов
/ 16 марта 2020

Вот полный код для получения значения varB. В котором вы можете избежать объявления CustomType[] myArray

public class Test 
{
    private static class CustomType 
    {
        public byte[] varA;
        public int varB;

        public CustomType() {
            varA = new byte[3];   
            varB = 13;
        }
    }


    public static void main(String... args) 
    {       
        System.out.println(new CustomType().varB);
    }
}
...