向空列表中添加内容

11

所以我有一个空列表,如下所示

List<Node> nodes = null;

然后我想将“Node”添加到其中

    try {
        File file = new File("test.txt");
        Scanner scanner = new Scanner(file);
        while (true){

            String first= scanner.next();
            if (first.equals("-1")){
                break;
            }
            Node node1= new Node(first, first);
            if (nodes==null){
                nodes.add(node1);
            }
            if (nodes!=null){
                if(nodes.contains(node1)){
                    nodes.add(node1);

                }
            }
    if (nodes==null){
    nodes.add(node1);
}

为什么这给我一个空指针错误?看起来空列表是不可变的。我怎样才能保持一个列表结构,同时又能从空列表开始构建它?

8个回答

15
List<Node> nodes = null;

这不是一个空列表,而是被初始化为 null 的列表引用。你想要的是:

List<Node> nodes = new LinkedList<Node>();

或类似的。这将给你一个空列表。

编辑:在问题改变后,这个逻辑完全混乱了:

Node node1= new Node(first, first);
if (nodes==null){
    nodes.add(node1);
}
if (nodes!=null){
    if(nodes.contains(node1)){
        nodes.add(node1);

    }
}

你所说的是,如果nodes == null(它现在不是),那么尝试将节点添加到列表中。如果它不为null,并且node1已经在列表中(实际上它不在),则将其添加到列表中。您可以使用以下代码替换上述行:

if (!nodes.contains(node1)) {
    nodes.add(node1);
}

该代码的作用是,如果节点在列表中不存在,则将其添加。


3
这是因为您尚未实例化对象“nodes”。
添加以下行,它应该可以工作:
 if (nodes==null){
      nodes = new ArrayList<Node>();
      nodes.add(node1);
  }

请注意,您不能实例化List对象。因此,您可以使用类似ArrayList / LinkedList等的东西。

1
在添加节点之前,您必须为列表分配内存:nodes = new ArrayList<Node>();。您试图向空列表添加节点,即向空虚无中添加节点。

2
你不能实例化 List 接口 :) - Bozho
зіҹзі•пјҢеә”иҜҘжҳҜArrayListжҲ–зұ»дјјзҡ„дёңиҘҝгҖӮжҲ‘дјҡзј–иҫ‘жҲ‘зҡ„зӯ”жЎҲгҖӮи°ўи°ўдҪ гҖӮ - Chris Parton

1
如果 nodesnull,你无法对其进行任何操作。将其初始化为 new ArrayList<Node>()。现在这是一个空列表。

1

你需要先初始化列表

nodes = new ArrayList<Node>();

例如:

if (nodes==null){
   nodes = new ArrayList<Node>();
   nodes.add(node1);
}

但是,与其有一个未初始化(null)的列表,还不如有一个空列表。

所以,不要这样写:List<Node> nodes = null; 而是写成 List<Node> nodes = new ArrayList<Node>(); 然后你可以删除整个 if 语句,并且总是使用 nodes.add(node1);,无论它是第一个还是第二个元素。


0

你的nodenull,所以这就是所有人说的错误... 这是获取null指针异常最常见的编程错误。最好使用findbug插件与你的eclipse一起使用;它不会允许你创建这种类型的错误。同时,它也会更容易地帮助你检测问题。


0
nodes = new ArrayList<Node>();

将其初始化为一个新对象(空的)应该有所帮助。


我刚刚犯了同样的错误,你不能实例化一个 List,它必须是 ArrayListLinkedList 等。 - Chris Parton
当然!感谢您指出。我想我还在C#模式下 :) - abhinav
哈哈,不用担心。我的回答也有人留言告诉我同样的事情。我正在使用C++模式。 - Chris Parton

0

这是一个确定的空指针异常,因为nodes为空

你的意思是

if (nodes!=null){
    nodes.add(node1);
}

同时初始化列表

nodes = new ArrayList()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接