NullPointerException при использовании массива объектов в Java - PullRequest
0 голосов
/ 05 мая 2011

У меня есть этот кусок кода, который выдает исключение Null Pointer в закомментированной строке .. Я думаю, что это может быть потому, что я не инициализировал массив ParentInterfaces, я прав ?? ... проблема в том, что это массив может содержать несколько элементов в диапазоне от 2 до 30. Мне бы не хотелось, чтобы идея инициализировала его во втором конструкторе, если я сделаю это, если это не приведет к утечке памяти в функции 2, поскольку у меня есть объект, чью ссылку я передаю к другой функции ???? ... Есть ли другая альтернатива, доступная ???

public class Class {
    public String modifier;
    public String name;
    public  Class parent;
    public  Interface[] parentInterfaces;
    public Method[] memberFunctions;
    public Class[] nestedClasses;
    public Interface[] nestedInterfaces;
    public Field[] memberData;
    public int methodCount, classCount, interfaceCount, fieldCount, parentInterfaceCount;

public Class (String classModifier,String className)
{
    modifier=classModifier;
    name=className;
    methodCount=0;
    classCount=0;
    interfaceCount=0;
    fieldCount=0;
    parentInterfaceCount=0;     
}

public void setParentInterfaces (Interface[] interfaces)
{
    while (interfaces[parentInterfaceCount] != null)
    {
// This is the line which throws the NPE
        parentInterfaces [parentInterfaceCount] = interfaces [parentInterfaceCount]; 

parentINterfaceCount ++; } } Теперь фрагмент кода, который приводит к вызову этой функции: (принадлежит функции diff в классе diff)

    // Prev Code    
    else if (child.getNodeName()=="ParentInterface")
    {
        Iflag=1;
        //Element ele=(Element)child;
        JOptionPane.showMessageDialog (null, "Parent Interface found" + child.getTextContent () + "for " + classes[i].name);
        parentInterfaces[parentICount] = new dataObjects.Interface (child.getTextContent ());
        // classes[i].parentInterfaces[parentICount] = new dataObjects.Interface (child.getTextContent ());
        parentICount++;
    }
}
classes[i].setParentInterfaces (parentInterfaces);

Ответы [ 6 ]

3 голосов
/ 05 мая 2011

Да, это потому, что вы не инициализировали parentInterfaces.

Ваши опции включают в себя:

  1. инициализация массива с максимальным ожидаемым размером (30).
  2. с использованием изменяемого размера Collection (такого как ArrayList), который, я думаю, потребует некоторой реструктуризации вашего текущего кода.
  3. Использование System.arraycopy для копирования массива интерфейсов в массив parentInterfaces

Кстати, ваш метод setParentInterfaces () не будет работать, так как индекс массива не увеличивается.

1 голос
/ 05 мая 2011

Вы объявляете переменную parentInterfaces, но не инициализируете ее.Попробуйте это ....

public void setParentInterfaces(Interface[] interfaces)
{
    parentInterfaces = new Interface[interfaces.length]
    while(interfaces[parentInterfaceCount]!=null)
    {
        parentInterfaces[parentInterfaceCount]=interfaces[parentInterfaceCount]

    }

}
1 голос
/ 05 мая 2011

Попробуйте использовать ArrayList<Interface> вместо массива, затем добавьте элементы с помощью parentInterfaces.add(item) и получите их с помощью parentInterfaces.get(). ArrayLists позаботятся о выделении памяти для вас.

На самом деле, может быть лучше использовать ArrayLists вместо массивов для всех ваших переменных.

0 голосов
/ 05 мая 2011

проблема в том, что этот массив может содержать несколько элементов в диапазоне от 2 до 30. Мне бы не хотелось, чтобы идея инициализировала его во втором конструкторе, если я сделаю это, если это не приведет к утечке памяти в функции 2так как у меня там есть объект, чью ссылку я передаю другой функции ????

Простой ответ: Нет. Инициализация массива не создает никаких объектов, только массив нулевых указателей.Даже если бы это произошло, Java делает беспокойство о «утечках» памяти плохой идеей.С другой стороны, стоит побеспокоиться об использовании памяти .Так как это язык для сборки мусора, нужно спросить: может ли сборщик мусора уменьшить объем памяти?Основное правило использования сборщика мусора таково: не держите лишних указателей в куче.Установив нулевые указатели в куче, почти всегда хорошо с точки зрения памяти.Указатели в стеке также почти всегда в порядке.

В вашем коде:

Ваш код трудно читать, потому что 1. Совершенно не ясно, что предполагается делать (это частькомпилятор?) 2. Ваша схема именования использует ключевые слова в языке / названиях классов, использованных в рефлексии 3. Здесь у вас есть немало кода, обычно лучше всего раскошелиться на код тура и начать его упрощать до абсолютно минимальногокод, который выдает вашу ошибку.

В частности, я не знаю, что должен делать этот фрагмент кода:

    while(interfaces[parentInterfaceCount]!=null)
    {
        parentInterfaces[parentInterfaceCount]=interfaces[parentInterfaceCount];

    }

Поскольку вы не увеличиваете parentInterfaceCount, этот код либо ничего не сделает, либо войдет в бесконечный цикл,Поэтому мне очень трудно понять, чего ты хочешь.Причина, по которой вы получаете исключение нулевого указателя, заключается в том, что parentInterfaces[parentInterfaceCount] может быть адресовано только при инициализации parentInterfaces.

Было бы легче помочь, если бы я знал, чего вы хотите достичь.

Тем не менее, я думаю, что у вас есть два варианта: либо инициализировать массив до максимального ожидаемого размера, либо использовать длину передаваемого вам массива, чтобы вычислить размер для инициализации во время выполнения.

Некоторые идеи, чтобы сделать жизнь проще:

  1. Использовать встроенный метод копирования массива, такой как System.arraycopy
  2. Использовать цикл for - это упрощает обработку таких вещей, как увеличение указателя
  3. Использовать коллекционный класс
0 голосов
/ 05 мая 2011

Вы не инициализировали свой массив. Вам нужно сделать что-то вроде этого

parentInterfaces = new Interface[];

Хотя я должен сказать, что это забавный код. Вам не нужно поддерживать массивы в переменных в Java. Вы можете просто сказать arrayObject.length ();

Я говорю, возьми хорошую книгу по Java :)

0 голосов
/ 05 мая 2011

Обычно вы должны инициализировать массивы перед их использованием. Кроме того, не называйте свой класс Class. Это уже существует в пакете java.lang.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...