Java中模拟UNIX文件系统中的空指针异常

时间:2015-04-20 02:53:27

标签: java nullpointerexception

我目前正在尝试帮助他们的Java课堂作业,而且作为一个不熟悉Java的人,我遇到了一些麻烦。我的代码如下:

文件类

public abstract class File {

private String name;
private Directory parent;
public File(String name){this.name=name;}
   Directory getParent(){return parent;}
  // String getPath(){}
}

TextFile类

public class TextFile extends File{
private String content;
TextFile(String name, String content){ super(name); }
String getContent(){ return content;}
void setContent(String content){this.content=content;}
}

目录类

import java.util.ArrayList;

public class Directory extends File{
private ArrayList<File> children;
Directory(String name){super(name);}
void addChild(File f){children.add(f);}
ArrayList<File> getChildren(){ return children; }
}

主要类

public class Driver {
public static void main(String[] args){
    Directory root = new Directory("/");
    Directory a = new Directory("a");

    if(a == null){
        System.out.println("A is null. Program will not continue.");
    }
    else{
    root.addChild(a);
    TextFile b = new TextFile("b", "hello world");
    }
    }
}

我遇到的问题是,当我尝试运行代码时,我得到一个空指针异常:

Directory.addChild(Directory.java:8)

Driver.main(Driver.java:12)

我不能为我的生活想到为什么会发生这种异常。我无法想到为什么在任何时候a都会为空。非常感谢任何帮助。谢谢!

3 个答案:

答案 0 :(得分:4)

让我们来看看你的Directory课程:

public class Directory extends File {
    private ArrayList<File> children;
    Directory(String name){ super(name); }
    void addChild(File f){ children.add(f); }
}

您永远不会初始化children

尝试添加构造函数:

children = new ArrayList<File>();

所以课程看起来像:

public class Directory extends File {

    private ArrayList<File> children;

    Directory(String name){
        super(name);
        children = new ArrayList<File>();
    }

    void addChild(File f){ children.add(f); }
}

或者,你可以写:

private ArrayList<File> children = new ArrayList<File>();

在Java 7及更高版本中,您可以将构造函数简化为:

new ArrayList<>()

假设类型相同。

答案 1 :(得分:3)

Directory

private ArrayList<File> children;

声明ArrayList但不初始化它。你需要像

这样的东西
private ArrayList<File> children = new ArrayList<>();

但我更喜欢编码为List interface喜欢

private List<File> children = new ArrayList<>();

答案 2 :(得分:3)

您需要先children实例化。

private ArrayList<File> children = new ArrayList<File>