2010-05-08 4 views
2

La partie err est capitalisée dans le code, il est également disponible en foreaching. En raison de la liste abstraite, il ne peut pas être initialisé, déclaration est dans un champ statique. Les listes ont le même type.Java: ListA.addAll (ListB) déclenche 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); 
       } 
     } 
} 

Pourquoi ne pas nouvelle liste() lors de l'initialisation?

La raison de l'absence d'initialisation était l'impossibilité d'utiliser = new List<String>(). Je ne peux pas voir une logique ne le permettant pas. Cela doit avoir quelque chose à voir avec des facteurs intrinsèques tels que les structures de données ou autre chose.

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

Pourquoi la liste est une interface?

Je sais que beaucoup de données strucs telles que la pile met en œuvre la liste. Mais je ne comprends pas pourquoi List est une interface et pourquoi pas Table par exemple. Je vois la liste comme une structure primitive avec laquelle vous pouvez implémenter d'autres structures. L'interface est une chose où vous pouvez spécifier les exigences pour une structure. La primitivité ou l'extensivenss sont-ils des raisons d'être une interface?

Répondre

12

Parce que ops est null. Le fait que la liste est une interface ne signifie pas que vous ne pouvez pas initialiser le champ:

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

List est une interface parce qu'il ya plusieurs façons de le mettre en œuvre tout en offrant le même marché (bien que différentes caractéristiques de performance). Par exemple, ArrayList est soutenu par gamme, tandis que LinkedList est une liste chaînée.

+0

Test.java:7:. java.util.List est abstraite, ne peut pas être instancié \t Liste public static ops = new Liste (); <- - mais je ne peux pas le comprendre – hhh

+1

Liste est une interface, donc il n'a pas de constructeur –

+0

Liste est une interface, mais si vous lo ok au code, il est en train de créer une ArrayList qui implémente l'interface List –

4

Vous devez instancier la liste des opérations.

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

ou un autre type de liste de votre choix.

1

ops est jamais initialisés.

Vous devez faire ops = new ArrayList<String>(); avant de faire la commande addAll. Sinon, vous appelez un objet nul.

La raison pour laquelle vous ne pouvez pas ops = new List<String> 'est parce que la liste est une interface et ne peut pas être initialisé. ArrayList n'est pas un type abstrait et étend List, il est donc approprié dans ce contexte.

Les types abstraits et les interfaces ne peuvent pas être créés en tant qu'objet réel et ne peuvent être utilisés que pour référencer un objet concret. Le type concret doit étendre le type abstrait ou l'interface que vous essayez d'utiliser.

1

Vous n'avez pas initialisé les opérations de liste;

par exemple.

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

Sinon, vous pouvez faire

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

ops n'a pas encore été initialisés.

déclaration de changement:

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

Vous ajoutez à quoi? Variable ops est toujours nulle, tout comme s est nul dans ce qui suit:

public static String s; 
0

Je pense que votre vraie question est:

Pourquoi ne puis-je instancier une liste?
ou Pourquoi ai-je: Test.java:7: java.util.List is abstract; cannot be instantiated public static List<String> ops = new List<String>();

En Java, la liste est une interface, qui est, comme vous le dites: Interface is a thing where you can specify requirements for a structure - est comme une description de poste qui doit être rempli. Mais vous ne pouvez pas extraire la description du travail du papier et l'utiliser simplement pour faire le travail, c'est-à-dire le List description du poste is abstract; cannot be instantiated.

Au lieu de cela, vous avez besoin de candidats pour combler la position décrite par la description de travail pour List. Les candidats («implémentations concrètes») qui répondent aux exigences du poste sont ArrayList, LinkedList, Vector, etc. À moins d'initialiser votre var List<String> ops avec un candidat spécifique pour faire le travail, vous n'avez personne (null) réellement faire le travail (il en soulevant un NullPointerException

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