Инициализируйте ArrayList.Когда необходимо? - PullRequest
2 голосов
/ 09 октября 2011

Из-за моей работы у меня сложилось впечатление, что когда я определяю атрибут ArrayList в классе в Java 7, нет необходимости инициализировать его (с новым как новый объект), когда я хочу получить к нему доступв методе в первый раз.Тем не менее, я всегда получаю ошибку nullPointerException (на моем персональном домашнем компьютере), несмотря на то, что я установил JDK1.7.0.Есть ли более новая версия, которую я должен установить, чтобы преодолеть это досадное происшествие?

открытый класс AdditionNode {

private VectorOperationCodeGen nodeCodeGen;
protected ArrayList<VectorInTree> connectedVectors;

... ... ...

открытый void inputVector (VectorInTree inputVector) {

    if(inputFlag==2||inputFlag==0){

    if(this.connectedVectors.isEmpty()){

Последняя строка вызывает исключение nullPointerException.Должно быть так?

Ответы [ 6 ]

2 голосов
/ 09 октября 2011

С самого начала Java значение по умолчанию для ссылок (которое вы называете "атрибут ArrayList") было null. Это также не изменится в будущем. Поэтому кто-то должен инициализировать их перед использованием списка.

Итак, этот простой объявляет ссылку на список и инициализирует ее с null:

class MyClass {
    private ArrayList<String> list;
}

Чтобы объявить и , инициализировать его с фактическим экземпляром , просто сделайте:

class MyClass {
    private ArrayList<String> list = new ArrayList<String>();
}

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

2 голосов
/ 09 октября 2011

Из-за моей работы у меня сложилось впечатление, что когда я определяю атрибут ArrayList в классе в Java 7, нет необходимости инициализировать его

Если вы используете ArrayList, то лучше инициализировать it.

Просто делая

ArrayList<SomeType> list;

вы только что объявили ссылку на ArrayList и фактически не создали ArrayList.

Если вы хотите быть «ленивым» при инициализации, то всякий раз, когда вам нужно получить доступ к списку, указанному list, вам нужно будет сделать

ArrayList<SomeType> list;

// ...

if (list == null)
    list = new ArrayList<SomeType>();
list.add(someElement);
2 голосов
/ 09 октября 2011

Я определяю атрибут ArrayList в классе в Java 7, нет необходимости инициализировать его (с новым как новый объект), когда я хочу получить доступ к нему в методе в первый раз.

Это false .Что произвело на вас такое впечатление?

1 голос
/ 09 октября 2011

Если я могу высказать свое мнение, ваше впечатление очень странное. Как вы можете использовать объект (например, список массивов) без инициализации и объявления ссылки? Только ссылаясь на объект и инициализируя его, вы можете использовать этот объект.

Если было бы возможно, что вы говорите, нет необходимости иметь ссылку на что-то в памяти, и вы решили проблемы выделения памяти. : -)

Вы должны быть яснее в своем вопросе.

EDIT

Теперь вы обновили вопрос. Да, это должно быть так, как вы говорите. Вы получаете NullPointerException от компилятора в строке if(this.connectedVectors.isEmpty()){, потому что вы не инициализировали ранее с оператором new объект connectedVectors.

Если вы только начинаете программировать на Java, это считается типичной ошибкой, и на данный момент вы прощены :-) Даже если забытая инициализация объекта считается типичной ошибкой начинающего программиста, это важная и серьезная ошибка, которую вы не должны повторять.

0 голосов
/ 09 октября 2011

Это «досадное происшествие» является частью дизайна языка программирования Java и не изменилось с самого начала.Ваши ожидания / впечатления ошибочны.

0 голосов
/ 09 октября 2011

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

Тем не менее, я не думаю, что вы можетеделай, что говоришь.

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