2015-07-09 2 views
2

Я пытаюсь добавить элементы в моей ArrayList называется activList с помощью:NullPointerException при добавлении элементов в ArrayList

activList.add(new Fiducial(iD, x, y)); 

Но я получаю NullPointerException на этой линии при выполнении кода:

int cols = 10, rows = 10; 
int rectangleWidth = 100; 
int rectangleHeight = 60; 

// these are some helper variables which are used 
// to create scalable graphical feedback 
int k, l, iD; 
float cursor_size = 15; 
float object_size = 60; 
float table_size = 760; 
float scale_factor = 1; 
float x, y; 

ArrayList<Fiducial> activList ; 


public class Fiducial { 
    public int iD; 
    public float x; 
    public float y; 

    public Fiducial(int iD, float x, float y) { 
    this.iD = iD; 
    this.x = x; 
    this.y = y; 
    } 
} 


void draw() { 
    // Begin loop for columns 
    for (k = 0; k < cols; k++) { 
    // Begin loop for rows 
    for (l = 0; l < rows; l++) { 
     fill(255); 
     stroke(0); 
     rect(k*rectangleWidth, l*rectangleHeight, rectangleWidth, rectangleHeight); 
    } 
    } 


    // This part detects the fiducial markers 
    float obj_size = object_size*scale_factor; 
    float cur_size = cursor_size*scale_factor; 

    ArrayList<TuioObject> tuioObjectList = tuioClient.getTuioObjectList(); 
    for (int i=0; i<tuioObjectList.size(); i++) { 
    TuioObject tobj= tuioObjectList.get(i); 
    stroke(0); 
    fill(0, 0, 0); 
    pushMatrix(); 
    translate(tobj.getScreenX(width), tobj.getScreenY(height)); 
    rotate(tobj.getAngle()); 
    rect(-80, -40, 80, 40); 
    popMatrix(); 
    fill(255); 
    x = round(10*tobj.getX()); 
    y = round(10*tobj.getY()); 
    iD = tobj.getSymbolID(); 
    activList.add(new Fiducial(iD, x, y)); 
    fiducialCoordinates(); 
    } 
} 


void fiducialCoordinates() { 
    System.out.println("x= "+ x + " y= " + y + " iD= " + iD); 
    System.out.println(activList); 
} 

Я прочитал эту страницу: What is a NullPointerException, and how do I fix it? (так что не сообщайте об этом как дубликаты, пожалуйста)

И я понял, что получаю ошибку, потому что у моего ArrayList нет никаких e lement. Тем не менее, я пытался добавить одну сразу после его создания, например:

ArrayList<Fiducial> activList ; 
activList.add(new Fiducial(3, 4.0, 5.0)); 

Но я получаю ошибку: «неожиданный маркер: (» на линии:

activList.add(new Fiducial(3, 4.0, 5.0)); 

я не получаю это, я думал, что добавление элемента будет препятствовать его быть Null, но я все еще получаю ошибку. Как я должен изменить это?

Спасибо за вашу помощь

+2

У Вас есть 'ArrayList activList = новый ArrayList () ; 'в любом месте вашего кода? – Marcin

+1

Эта строка 'ArrayList activList;' должна быть 'ArrayList activeList = new ArrayList ();' – brso05

+2

Смотрите http://stackoverflow.com/questions/218384 .. то же самое, другой код. Фактическая задача/код в основном не имеет значения. – user2864740

ответ

7

Вы никогда не создать экземпляр ArrayList с помощью new. Память ArrayList не выделена.

Fix это так:

ArrayList<Fiducial> activList = new ArrayList<Fiducial>(); 

Из документов:

Instantiation: The new keyword is a Java operator that creates the object.

Initialization: The new operator is followed by a call to a constructor, which initializes the new object.

только с примитивными типами просто объявить переменную, как вы делали выделить память для него. Объектам требуется ключевое слово new, чтобы связать с ними память.

4

Вы должны инициализировать ссылку на список, как это:

ArrayList<Fiducial> activList = new ArrayList<Fiducial>(); 
activList.add(new Fiducial(3, 4.0, 5.0)); 

Вы указываете, что ссылка activList будет указать ArrayList объект в динамической памяти. Вы можете попробовать другие способы для инициализации:

// List -> use ArrayList or LinkedList 
List<Fiducial> activList = new ArrayList<Fiducial>(); 
// Collection -> use List, Set or Queue realizations 
Collection<Fiducial> activList = new ArrayList<Fiducial>(); 

Это поможет вам сделать ваш код более гибки.

2

Эта строка автоматически инициализирует activList значением null, поэтому вам необходимо его установить.

ArrayList<Fiducial> activList ; 

Вы должны иметь это быть:

List<Fiducial> activList = new ArrayList<Fudicial>(); 
2

Чтобы добавить к двум другим ответам:

Вы не получаете ошибку пустого указателя, потому что ваш ArrayList пуст.

Вы все равно можете сделать ссылку на пустой массив.

Если бы вы не могли, как еще вы могли бы инициализировать массивList и назначить ссылку на него?

Вы получали нулевую ошибку указателя, потому что вы никогда не инициализируется ваш ArrayList<Fiducial> с new ArrayList<Fiducial>();

Поэтому ссылка является недействительным, поскольку он не был на самом деле ссылается ни на ArrayList.

3

Просто используйте его, используя новый ключевое слово:

ArrayList<Fiducial> activList = new ArrayList<Fiducial>(); 

или в Java 7, использовать алмазную оператор:

ArrayList<Fiducial> activList = new ArrayList<>(); 
Смежные вопросы