2015-05-02 6 views
-2

Учитывая следующее:Java NullPointerException и ArrayList

import java.util.ArrayList; 

public class IntegerList { 

    public ArrayList<Integer> list; 
    private int front; 
    private int[] integers = getIntegers(); 

    public IntegerList (int maxCapacity) { 
     list = new ArrayList<Integer>(maxCapacity); 
     for (int i = 0; i < maxCapacity; i++) { 
      list.add(null); 
     } 
     front = 0; 
    } 

    public int getCapacity() { 
     if (list.get(front) == null) 
      return 0; 
     else 
      return 10; 
    } 

    public int[] getIntegers() { 
     int[] integers = new int[getCapacity()]; 
     return integers; 
    } 
} 

Когда я создаю экземпляр класса IntegerList пропускания 20 к параметру maxCapacity в конструкторе я получаю следующее сообщение во время компиляции:

Exception in thread "main" java.lang.NullPointerException 
    at IntegerList.getCapacity(IntegerList.java:18) 
    at IntegerList.getIntegers(IntegerList.java:26) 
    at IntegerList.<init>(IntegerList.java:7) 
    at Test.main(Test.java:5) 

Почему я получаю исключение? Похоже, что проблема в list.get (front) в getCapacity(), но не возвращает ли это null, возвращая true для оператора if?

+0

@AniketThakur Не в «списке», они не будут. – chrylis

+0

Да, путайте его для 'array'. –

+0

Спасибо всем за ваш вклад. – Martin

ответ

0

Ваш инициализатор integers = getIntegers(); неявно вставлен в начало вашего конструктора и запускается до list = new ArrayList<Integer>(maxCapacity);.

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

0

Причиной этого является утверждение: private int[] integers = getIntegers();

При создании экземпляра этого класса приводит к вызову метода getIntegers которая вызывает getCapacity но list еще не инициализирован, и это null. Поэтому, когда он вызывает list.get(front), он получает NPE.

0

Ваш код private int[] integers = getIntegers(); выполняется во время инициализации экземпляра IntegerList.

Изменить код

public int getCapacity() { 
    if (list == null || list.get(front) == null) 
     return 0; 
    else 
     return 10; 
} 
0

Удалить эту пустую вещь в массиве конструктора. По умолчанию Nulls уже есть. Во-вторых, изменение private int [] integers = getIntegers(); вещь до частное int [] целые числа;

и сделать это, как в последней строке конструктора кода:

целые = getIntegers();

0

Точка является instance member initialization takes place secretly before the explicit constructor code вы предоставите, следовательно, в вашем случае

private int[] integers = getIntegers(); 

пинки в качестве первой линии исполнения при вызове конструктора инициализации IntegerClass и в этот момент список ArrayList является все еще указывая на нуль и, следовательно, не может быть использован.

0

смотреть на это,

public int getCapacity() { 
     if (list.get(front) == null) 
      return 0; 
     else 
      return 10; 
    } 

вы получаете NullPointerException, потому что вы храните null. и list.get(front), когда вы пытаетесь получить значение, он будет перебрасывать исключение перед сравнением.

его тесто вы храните 0 вместо нуля. или использовать этот код в блоке try catch. подобный следующий.

public int getCapacity() { 
    int result =0; 
try{ 
     if (list.get(front) != null) 
      return 10; 
    }catch(Exception e) { 
    return 0 
} 

} 
Смежные вопросы