【问题标题】:Java: ListA.addAll(ListB) fires NullPointerException?Java:ListA.addAll(ListB) 触发 NullPointerException?
【发布时间】:2010-05-08 05:10:43
【问题描述】:

err 部分在代码中大写,在 foreaching 中也有。由于抽象列表,无法初始化,声明在静态字段中。这些列表具有相同的类型。

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()?

未初始化的原因是无法使用= new List&lt;String&gt;()。我看不到不允许这样做的逻辑。它必须与内在因素有关,例如数据结构或其他东西。

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

为什么列表是一个界面?

我知道许多数据结构,例如堆栈实现列表。但是我不明白为什么 List 是一个接口,而为什么不是 Table 。我将 list 视为一种原始结构,您可以使用它来实现其他结构。接口是您可以指定结构要求的东西。是接口的原始性还是扩展性的原因?

【问题讨论】:

  • 我在使用 List immutableList = Collections.emptyList(); 时遇到了类似的问题更改为 List mutableList = new ArrayList();解决了。​​

标签: java list nullpointerexception add


【解决方案1】:

因为 ops 为空。 List 是一个接口这一事实并不意味着您不能初始化该字段:

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

List 是一个接口,因为在提供相同合约的同时有多种实现方式(尽管性能特征不同)。例如,ArrayList 是数组支持的,而LinkedList 是一个链表。

【讨论】:

  • Test.java:7: java.util.List 是抽象的;无法实例化 public static List ops = new List();
  • List是一个接口,所以它没有构造函数。
  • List 是一个接口,但如果你看代码,它正在创建一个实现 List 接口的 ArrayList
  • 那一行的真正含义是什么:“List hello”?名为 hello 的接口 -- 使用 String 操作?
  • HH,接口名称为List。它专门针对String,所以List&lt;String&gt;helloList&lt;String&gt; 类型的引用变量。但是你真的需要找到一个好的 Java 教程。
【解决方案2】:

你需要实例化操作列表。

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

或您选择的其他列表类型。

【讨论】:

    【解决方案3】:

    你还没有初始化List 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);
                }
        }
    }
    

    【讨论】:

      【解决方案4】:

      ops 尚未初始化。

      将声明更改为:

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

      【讨论】:

        【解决方案5】:

        ops 永远不会被初始化。

        在执行 addAll 命令之前,您必须执行 ops = new ArrayList&lt;String&gt;();。否则你调用的是一个空对象。

        之所以不能做ops = new List&lt;String&gt;'是因为List是一个接口,不能初始化。 ArrayList 不是抽象类型,扩展了 List,所以在这种情况下是合适的。

        抽象类型和接口不能被创建为一个实际的对象,只能用来引用一些具体的对象。具体类型必须扩展您尝试使用的抽象类型或接口。

        【讨论】:

          【解决方案6】:

          你在添加什么?变量ops 仍然为空,就像下面的s 为空一样:

          public static String s;
          

          【讨论】:

            【解决方案7】:

            我认为你真正的问题是:

            为什么我不能实例化一个列表?
            为什么我会收到:Test.java:7: java.util.List is abstract; cannot be instantiated public static List&lt;String&gt; ops = new List&lt;String&gt;();

            在 Java 中,List 是一个接口,正如您所说:Interface is a thing where you can specify requirements for a structure - 它就像一个需要填写的职位描述。但是你不能把工作描述从纸上剪下来,简单地用它来完成工作,即List工作描述is abstract; cannot be instantiated

            相反,您需要候选人填补List 职位描述中描述的职位。满足工作要求的候选人(“具体实施”)是ArrayListLinkedListVector 等。除非你用特定的候选人初始化你的List&lt;String&gt; ops var 来完成这项工作,否则你已经没有人 (null) 来实际做这项工作(通过提出 NullPointerException.

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

            【讨论】:

              猜你喜欢
              • 2017-09-01
              • 1970-01-01
              • 1970-01-01
              • 2016-07-08
              • 2014-04-09
              • 2013-06-26
              • 1970-01-01
              • 1970-01-01
              • 2017-11-15
              相关资源
              最近更新 更多