2011-11-30 33 views
6

所以,我有一个空列表,像这样增加空单

List<Node> nodes = null; 

,然后我想补充的“节点” S进去

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

也给我一个空指针错误? 看起来空列表是不可变的。我怎么能仍然保持一个List结构,并仍然从空构建呢?

回答

1

在添加节点之前,您必须将内存分配给列表:nodes = new ArrayList<Node>();。您正尝试将节点添加到空列表中,即将节点添加到空。

+2

你不能实例化'List'接口:) – Bozho

+0

哎呀,应该是'ArrayList'或类似的。我会编辑我的答案。为此欢呼。 –

8
List<Node> nodes = null; 

这不是一个空的列表,这是一个列表引用,它被iniitalized为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); 

    } 
} 

什么你在这里说的是,如果节点== NULL(它现在还不是),然后尝试将节点添加到列表中。如果它不为空,并且node1已经在列表中(它不是),那么将它添加到列表中。您可以替换线以上:

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

如果节点不在列表中存在它说,添加它。

1

您需要initalize列表第一

nodes = new ArrayList<Node>(); 

例如:

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

但它确实是最好有一个空列表,而不是一个不initialzed(空)名单。

所以不是:List<Node> nodes = null;List<Node> nodes = new ArrayList<Node>();,那么你就能取出完整的if和使用始终nodes.add(node1);,不管它是第一个或第二个元素。

0
nodes = new ArrayList<Node>(); 

初始化它到一个新的对象(空)应该有所帮助。

+0

我只是犯了同样的错误,你不能实例化一个'List',它必须是一个'ArrayList'或'LinkedList'等当然是 –

+0

!感谢您指出。仍然在C#模式,我猜:) – abhinav

+0

哈哈没有后顾之忧。我收到了一条评论,告诉我与我的答案相同。我处于C++模式。 –

1

如果nodesnull,你不能对它做任何事情。初始化为new ArrayList<Node>()。这现在是一个空的列表。

0

这是一个肯定的空指针异常为nodes是空

你的意思

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

而且初始化列表

nodes = new ArrayList() 
1

这是因为你还没有实例化你的对象“节点”。

添加以下行,它应该工作:

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

另外请注意,你不能实例化对象的列表。所以你可以使用像ArrayList/LinkedList等

0

nodenull所以这是像所有说的错误...这是最常见的编程错误获得null pointer exception。它更好地使用findbug插件与您的日食;它不会允许你创建这种错误。此外,您将更容易检测到问题。