使用findChild方法构建文件树

时间:2016-10-13 02:53:47

标签: java nullpointerexception

我想实现以下代码。要求如下

  1. 完成构造函数并测试您在方法main中执行的操作。
  2. 在方法main中,构建一个包含几个节点的树,然后为每个名称调用findChild。他们会失败。完成方法findChild直到测试通过。
  3. 我很困惑的一件事是f1的FileNode为null,并且null值不能放在hashmap中(将显示空指针错误)。我该怎么做才能防止这个问题。

    这是我做的代码

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

    以下是错误消息:

    Exception in thread "main" java.lang.NullPointerException
        at part2.FileNode.addChild(FileNode.java:126)
        at part2.FileNode.main(FileNode.java:152)
    

1 个答案:

答案 0 :(得分:0)

  

f1的FileNode为null,并且无法将空值放入hashmap

我认为null可以放在HashMap中,至少作为值。

错误意味着children == null,因为你从未初始化它!所以解决这个问题......

public void addChild(String name, FileNode childNode) {
    if (this.children == null) {
        this.children = new HashMap<String, FileNode>();
    }
    this.children.put(name, childNode);
}

但是,当你找到一个孩子时,你只是在检查直系孩子。您需要迭代文件树,直到找到所需内容。

public FileNode findChild(String name) {
    // Base case - no children
    if (children == null) return null;

    // Get the child, if exists
    FileNode immediateChild = children.get(name);
    if (immediateChild != null) {
        return children.get(name);
    } 
    else { // Iterate all children until found
        FileNode tmp = null;
        for (FileNode f : getChildren()) {
            if (tmp != null) break;
            tmp = f.getChild(name);
        }
        return tmp;
    }
}