I want to implement the following code. The requirements are as follow
- Complete the constructor and test what you did in method main.
- In method main, build a tree with a few nodes, then call findChild for each of the names. They will fail. Complete method findChild until the tests pass.
One thing I'm confused is that the FileNode for f1 is null, and null value cannot be put in hashmap (will show the null pointer error). How should I do to prevent this issue.
Here is the code I did
package part2;
import java.util.Map;
import javax.swing.JFileChooser;
import java.io.File;
import java.util.Collection;
/**
* The root of a tree representing a directory structure.
*/
public class FileNode {
/** The name of the file or directory this node represents. */
private String name;
/** Whether this node represents a file or a directory. */
private FileType type;
/** This node's parent. */
private FileNode parent;
/**
* This node's children, mapped from the file names to the nodes. If type is
* FileType.FILE, this is null.
*/
private Map<String, FileNode> children;
/**
* A node in this tree.
*
* @param name
* the file
* @param parent
* the parent node.
* @param type
* file or directory
* @see buildFileTree
*/
public FileNode(String name, FileNode parent, FileType type) {
this.name = name;
this.parent = parent;
this.type = type;
// TODO: complete this method.
}
/**
* Find and return a child node named name in this directory tree, or null
* if there is no such child node.
*
* @param name
* the file name to search for
* @return the node named name
*/
public FileNode findChild(String name) {
// TODO: complete this method.
if (children.containsKey(name)) {
return children.get(name);
}
else{
return null;
}
}
/**
* Return the name of the file or directory represented by this node.
*
* @return name of this Node
*/
public String getName() {
return this.name;
}
/**
* Set the name of the current node
*
* @param name
* of the file/directory
*/
public void setName(String name) {
this.name = name;
}
/**
* Return the child nodes of this node.
*
* @return the child nodes directly underneath this node.
*/
public Collection<FileNode> getChildren() {
return this.children.values();
}
/**
* Return this node's parent.
*
* @return the parent
*/
public FileNode getParent() {
return parent;
}
/**
* Set this node's parent to p.
*
* @param p
* the parent to set
*/
public void setParent(FileNode p) {
this.parent = p;
}
/**
* Add childNode, representing a file or directory named name, as a child of
* this node.
*
* @param name
* the name of the file or directory
* @param childNode
* the node to add as a child
*/
public void addChild(String name, FileNode childNode) {
this.children.put(name, childNode);
}
/**
* Return whether this node represents a directory.
*
* @return whether this node represents a directory.
*/
public boolean isDirectory() {
return this.type == FileType.DIRECTORY;
}
/**
* This method is for code that tests this class.
*
* @param args
* the command line args.
*/
public static void main(String[] args) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
int returnVal = fileChooser.showOpenDialog(null);
File file;
if (returnVal == JFileChooser.APPROVE_OPTION) {
file = fileChooser.getSelectedFile();
System.out.println(file);
}
System.out.println("Testing FileNode");
FileNode f1 = new FileNode("top", null, FileType.FILE);
FileNode f2 = new FileNode("top", f1, FileType.FILE);
f2 = file;
f1.addChild("c1", f2);
System.out.println(f2.findChild("c1"));
if (!f1.getName().equals("top")) {
System.out.println("Error: " + f1.getName() + " should be " + "top");
}
}
}
and here is the error message:
Exception in thread "main" java.lang.NullPointerException
at part2.FileNode.addChild(FileNode.java:126)
at part2.FileNode.main(FileNode.java:152)