我目前正在尝试帮助他们的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
都会为空。非常感谢任何帮助。谢谢!
答案 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>