2010-05-08 6 views
2

Часть ошибки заглавная в коде, она также входит в foreaching. Из-за абстрактного списка его нельзя инициализировать, декларация находится в статическом поле. Списки имеют один и тот же тип.Java: ListA.addAll (ListB) запускает NullPointerException?

import java.util.*; 

public class Test 
{ 

     public static final List<String> highPrio = Arrays.asList("*","/"); 
     public static List<String> ops; 

     public static void main(String[] args) 
     { 
       //ERROR HERE, why do it throw nullPointer? 
       ops.addAll(highPrio); 

       for(String s : ops) 
       { 
         System.out.println(s); 
       } 
     } 
} 

Почему не новый список() в инициализации?

Причиной не инициализации является невозможность использования = new List<String>(). Я не вижу логики, не позволяющей этого. Это должно иметь какое-то отношение к внутренним факторам, таким как структура данных или что-то еще.

Test.java:7: java.util.List is abstract; cannot be instantiated public static List<String> ops = new List<String>();

Почему список представляет собой интерфейс?

Я знаю, что многие данные, такие как стек, реализуют список. Но я не могу понять, почему List является интерфейсом и почему не Table, например. Я вижу список как примитивную структуру, с помощью которой вы можете реализовать другие структуры. Интерфейс - это то, где вы можете указать требования к структуре. Является ли primitivenness или extensivens причиной быть интерфейсом?

ответ

12

Потому что ops null. Тот факт, что список является интерфейс не означает, что вы не можете инициализировать поле:

public static List<String> ops = new ArrayList<String>(); 

List представляет собой интерфейс, потому что есть несколько способов его реализации, обеспечивая при этом один и тот же контракт (хотя различные характеристики производительности). Например, ArrayList поддерживает массив, а LinkedList - связанный список.

+0

Test.java:7:. java.util.List является абстрактным, не может быть создан \t общественности статического списка опса = новый список (); <- - но я не могу этого понять. – hhh

+1

Список - это интерфейс, поэтому он не имеет конструктора. –

+0

Список - это интерфейс, но если вы lo ok в коде, он создает ArrayList, который реализует интерфейс List. –

4

Вам необходимо создать экземпляр списка опций.

public static List<String> ops = new ArrayList<String>(); 

или другой тип списка по вашему выбору.

1

Операции не инициализируются.

Вы должны сделать ops = new ArrayList<String>();, прежде чем выполнять команду addAll. В противном случае вы вызываете нулевой объект.

Причина, по которой вы не можете сделать ops = new List<String>, состоит в том, что List является интерфейсом и не может быть инициализирован. ArrayList не является абстрактным типом и расширяет List, поэтому он подходит в этом контексте.

Абстрактные типы и интерфейсы не могут быть созданы как фактический объект и могут использоваться только для ссылки на конкретный объект. Конкретный тип должен расширять абстрактный тип или интерфейс, который вы пытаетесь использовать.

1

Вы не инициализировали список ops;

например.

public static List<String> ops = new ArrayList<String>(); 

В качестве альтернативы вы можете сделать

import java.util.*; 

public class Test 
{ 

    public static List<String> ops; 

    public static void main(String[] args) 
    { 
      ops = Arrays.asList(new String[] {"*", "/"}); 

      for(String s : ops) 
      { 
        System.out.println(s); 
      } 
    } 
} 
1

опа не инициализированы.

декларация изменение:

public static List<String> ops = new ArrayList<String>(); 
0

Вы добавляете к чему? Переменная ops по-прежнему нулевой, так же, как s равно нулю в следующем:

public static String s; 
0

Я думаю, что ваш реальный вопрос:

Почему я не могу создать экземпляр списка?
или Почему я получаю: Test.java:7: java.util.List is abstract; cannot be instantiated public static List<String> ops = new List<String>();

В Java, List является интерфейсом, который, как вы говорите: Interface is a thing where you can specify requirements for a structure - его, как описание работы, которая должна быть заполнена. Но вы не можете скопировать описание задания из бумаги и просто использовать его для выполнения задания, то есть List описание вакансии is abstract; cannot be instantiated.

Вместо этого вам нужны кандидаты для заполнения позиции, описанной в описании задания для List. Кандидаты («конкретные реализации»), отвечающие требованиям к заданию, являются ArrayList, LinkedList, Vector и т. Д. Если вы не инициализируете свой List<String> ops var конкретным кандидатом для выполнения задания, у вас нет никого (null) на самом деле сделать работу (там, подняв NullPointerException

List<String> ops = new ArrayList<String>();