添加到空列表

suj*_*ge9 8 java list

所以我有一个像这样的空列表

List<Node> nodes = null;
Run Code Online (Sandbox Code Playgroud)

然后我想在其中添加"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);

                }
            }
Run Code Online (Sandbox Code Playgroud)

所以很明显在空列表中执行.contains会给我一个异常错误,但为什么这样做呢

    if (nodes==null){
    nodes.add(node1);
}
Run Code Online (Sandbox Code Playgroud)

还给我一个空指针错误?似乎空列表是不可变的.我怎样才能保持List结构并仍然从空构建它?

Mat*_*ell 10

List<Node> nodes = null;
Run Code Online (Sandbox Code Playgroud)

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

List<Node> nodes = new LinkedList<Node>();
Run Code Online (Sandbox Code Playgroud)

或类似的.这会给你一个空列表.

编辑:更改问题后,这个逻辑完全搞砸了:

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

    }
}
Run Code Online (Sandbox Code Playgroud)

你在这里说的是,如果nodes == null(现在不是),那么尝试将节点添加到列表中.如果它不为null,并且node1已经在列表中(它不是),则将其添加到列表中.您可以将以上行替换为:

if (!nodes.contains(node1)) {
    nodes.add(node1);
}
Run Code Online (Sandbox Code Playgroud)

如果节点不存在于列表中,则添加它.


Chr*_*ton 1

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

  • 你无法实例化 `List` 接口:) (2认同)