Java:ListA.addAll(ListB)会触发NullPointerException吗?

时间:2010-05-08 05:10:44

标签: java list nullpointerexception add

错误部分在代码中是大写的,它也在预告中。由于抽象列表,它无法初始化,声明在静态字段中。列表具有相同的类型。

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);
                }
        }
}

为什么不在初始化中使用新的List()?

未初始化的原因是无法使用= new List<String>()。我看不到不允许它的逻辑。它必须与内在因素有关,例如数据结构或其他内容。

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

为什么列表是一个界面?

我知道许多数据结构如堆栈实现列表。但我无法理解为什么List是一个接口,为什么不以Table为例。我将list视为一个原始结构,您可以使用它来实现其他结构。接口是可以指定结构要求的东西。作为界面的原始性或广泛性的原因是什么?

7 个答案:

答案 0 :(得分:12)

因为ops为null。 List是一个接口这一事实并不意味着你无法初始化该字段:

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

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

答案 1 :(得分:4)

您需要实例化操作列表。

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

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

答案 2 :(得分:1)

ops永远不会被初始化。

在执行addAll命令之前,您必须执行ops = new ArrayList<String>();。否则你正在调用一个空对象。

您无法执行ops = new List<String>'的原因是因为List是一个接口,无法初始化。 ArrayList不是一个抽象类型并扩展了List,所以在这种情况下它是合适的。

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

答案 3 :(得分:1)

您尚未初始化List ops;

e.g。

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 :(得分:1)

ops尚未初始化。

将声明更改为:

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

答案 5 :(得分:0)

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

public static String s;

答案 6 :(得分: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的职位描述所描述的职位。满足工作要求的候选人(“具体实施”)是ArrayListLinkedListVector等。除非您使用特定候选人初始化List<String> ops var为了完成这项工作,你没有人(null)真正开展工作(通过提出NullPointerException

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