2012-01-08 4 views
1

борется с чем-то. Я построил доказательство концепции и googled, но не могу найти причину.Использование ArrayLists как статических свойств в классах?

  1. В настоящее время я пытаюсь использовать ArrayList как статическое свойство в классе для хранения ряда записей. Единственная проблема заключается в том, что каждый раз, когда я пытаюсь добавить к массиву Arrayalist, я получаю nullPointerError.

Поблагодарили бы за указание, где я иду не так?

Мой класс:

import java.util.ArrayList; 


public class Competition { 
private static ArrayList totalentries; 

public Competition(){ 


} 
public void newEntry(){ 
    totalentries.add("an Entry"); 
} 

} 

Мой Тест Код:

public class testEntries { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     Competition myComp=new Competition(); 
     myComp.newEntry(); //Null Pointer comes here! 
     myComp.newEntry(); 
     myComp.newEntry(); 
     myComp.newEntry(); 
     myComp.newEntry(); 
     myComp.newEntry(); 

     myComp.toString(); 
    } 

} 
+0

Как отмечено многими ниже (давайте посмотрим, сколько ответов ответят на этот поток!) - вы никогда не создаете экземпляр массива ArrayList. С чего статично начинать? –

+0

Эта переменная не должна быть статической. И его тип должен быть списком . –

ответ

1

Вы никогда не инстанцирован totalentries в классе конкуренции.

Вам нужно будет что-то вроде:

private static ArrayList totalentries = new ArrayList(); 

Однако, обратите внимание, что я бы не советовал держать это «статический». В противном случае каждый «Конкурс», который вы создаете, будет делиться одним и тем же списком записей, что, скорее всего, не то, что вы действительно хотите.

Кроме того, объявляйте свои типы с помощью интерфейсов, а не создавайте экземпляры типов. Вы также можете использовать Generics здесь. Так даже лучше (и следующие стандартные соглашения об именах):

private List<String> totalEntries = new ArrayList<String>(); 
+0

Спасибо за расчистку. Я сделал еще несколько исследований, и теперь понимаю это лучше! Спасибо :) –

0

totalentries не инициализирован, и он указывает на null. Сделать это следующим образом:

private static List<String> totalentries = new ArrayList<String>(); 
0

Список должен быть создан перед использованием, попробуйте totalentries = новый ArrayList();

Вместо этого вы должны использовать List вместо переменной totalentries, чтобы разрешить обмен te ArrayList, например LinkedList.

1

Вы никогда не делаете ArrayList. Попробуйте это:

private static ArrayList totalentries = new ArrayList(); 

хотя было бы лучше использовать дженерики и получить время компиляции безопасность:

private static ArrayList<String> totalentries = new ArrayList<String>(); 

Поскольку этот список имеет свойства, которые вы не хотели бы его заменить, поэтому было бы еще лучше, если бы вы определить это следующим образом:

private static final ArrayList<String> totalentries = new ArrayList<String>(); 

Действительно, хотя ни один из них не являются хорошими идеями, потому что вы могли бы иметь несколько экземпляров вашего класса меняется totalentries в то же время. Если это ваше намерение, то несколько Competition s используют один статический totalentries для хранения, тогда вам лучше отслеживать эти данные в отдельном классе.

Если вы используете только один Competition за один раз, удалите ключевое слово static.

+0

Спасибо за удивительную подробную помощь! Я читал больше и теперь вижу свою ошибку! –

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