1

我在尝试运行我的程序时遇到了一个令人讨厌的问题,即抛出空指针异常。

我现在正在研究的这个程序是我仍在研究的程序的另一个扩展。

在这一部分中,我只是添加了一个 FileFilter,因此在大多数情况下,实现应该是相同的。

这是我的代码:

    import java.io.*;
    import java.util.*;

    public class DirectorySize extends DirectoryProcessor
    {


        /*
            Dan Czarnecki
            October 29, 2013

            Class variables:
                private HashMap<File, DirectoryStatistics> directory
                    A HashMap object that will contain the files and folders
                    within a directory

            Constructors:
                public DirectorySize(File startingDirectory) throws FileNotFoundException
                    Creates a DirectorySize object, takes in a pathname (inherited from DirectoryProcessor class,
                    and has a single hashmap of a DirectoryStatistics object to hold the files and folders
                    within a directory

            Methods:
                public void processFile(File file)
                    A method that searches for all the files and folders
                    within a directory and calculated the total size
                    for each of them
                public void run()
                    Calls the processFile() method and prints out
                    the files and folders (along with their sizes)
                    in the directory
                public String toString()
                    Returns each element in the directory Vector


            Modification History
                October 29, 2013
                    Original version of class
                    Implemented run() and processFile() methods
                October 30, 2013
                    Added implementation of FileFilter to processFile() method
            */
            private HashMap<File, DirectoryStatistics> directory;

            public DirectorySize(File startingDirectory, FileFilter fileFilter) throws FileNotFoundException
            {
                super(startingDirectory, fileFilter);
                directory = new HashMap <File, DirectoryStatistics>();
            }


            public void processFile(File file, FileFilter fileFilter) throws FileNotFoundException
            {
                DirectoryStatistics parent;
                int index;
                File parentFile;
                boolean find;
                boolean filter;

                if(fileFilter == null)
                {
                    System.out.println("null" + fileFilter);
                }

                if(file == null)
                {
                    System.out.println("null");
                }

                parentFile = file.getParentFile();
                parent = new DirectoryStatistics(parentFile, fileFilter);
                find = directory.containsValue(parent);
                filter = fileFilter.accept(file);

                if(find)
                {
                    directory.put(parentFile, parent);
                    if(filter)
                    {
                        directory.get(parentFile).setSizeInBytes(file.length());
                        directory.get(parentFile).incrementFileCount();
                    }

                }


                if(find)
                {
                    if(filter)
                    {
                        directory.get(find).addToSizeInBytes(file.length()); //increments the total size of the directory
                        directory.get(find).incrementFileCount(); //increments the number of files in the directory
                    }

                }


            }

            public void run() throws FileNotFoundException
            {
                File file;
                file = directoryLister.next();


                while(file != null) //the following will be called when the File object is not null
                {
                    processFile(file, fileFilter);
                    file = directoryLister.next();
                }

            }

            public String toString()
            {
                Set<File> parentFile = directory.keySet();
                File[] parentFileArray = parentFile.toArray(new File[0]);

                String str; //creates a new string that will hold the file or directory name
                str = "";

                for(int i = 0; i < parentFileArray.length; i++)
                {
                    str = str + directory.get(parentFileArray[i]).toString();
                }

                return str;
            }    
        }
import java.io.*;
import java.util.*;

public class FileNamesEndingWithFileFilter implements FileFilter
{
    /*
    Dan Czarnecki
    October 30, 2013

    Class variables:
        private String ending
            Tells the program to search for programs with
            certain extensions
        private boolean isCaseSensitive
            Tells the program if the file extension is
            case sensitive or not

    Methods
        public void FileNamesEndingWithFileFilter(String ending, boolean isCaseSensitive)

        public boolean accept(File file)

    */
    private String ending;
    private boolean isCaseSensitive;

    public FileNamesEndingWithFileFilter(String ending, boolean isCaseSensitive)
    {
        if(ending == null)
        {
            throw new IllegalArgumentException("null input");
        }

        ending = ending;
        isCaseSensitive = isCaseSensitive;
    }

    public boolean accept(File file)
    {
        String name;
        name = file.getName();

        if(isCaseSensitive)
        {
            return name.endsWith(ending);
        }

        else
        {
            name = name.toLowerCase();
            ending.toLowerCase();
            return name.endsWith(ending);
        }
    }
}

import java.io.*;

public class TestDirectoryListerPart7
{
    /*
    Dan Czarnecki
    October 29, 2013

    Class variables:
    N/A

    Constructors:
    N/A

    Methods:
        public static void main(String[] args) throws FileNotFoundException
            Performs the functions of the Directory Processing program,
            implementing the functions of the DirectoryProcessor,
            DirectorySize, and DirectoryStatistics classes

    Modification history:
        October 29, 2013
            Created class in which program will run in

    */
    public static void main(String[] args) throws FileNotFoundException
    {
        DirectoryProcessor directoryProcessor;
        File startingDirectory;
        FileFilter fileFilter;

        startingDirectory = new File("U:/MyWeb/Coursework/");
        fileFilter = new FileNamesEndingWithFileFilter("class", true);
        directoryProcessor = new DirectorySize(startingDirectory, fileFilter);

        System.out.println("Determining total number of bytes in each directory: " + startingDirectory);
        directoryProcessor.run();
        System.out.println(directoryProcessor);
    }
}

运行此程序时,我的 processFile() 方法中的 FileFilter 和 File 的值都返回空指针异常。
这是我收到的详细错误消息:

Exception in thread "main" java.lang.NullPointerException
    at DirectorySize.processFile(DirectorySize.java:71) (the call to my accept() method in my FileNamesEndingWithFileFilterClass)
    at DirectorySize.run(DirectorySize.java:106) (the call to my processFile() method)
    at TestDirectoryListerPart7.main(TestDirectoryListerPart7.java:37) (the call to my run() method in DirectorySize)
4

2 回答 2

1

您正在检查是否fileFilter为空,如果为空,您只需将其打印到控制台并继续,稍后尝试使用该对象。自然,它会抛出一个NullPointerException. 您可能希望返回 if(或确保您没有将 null fileFilter 传递给您的processFile方法)。像这样:

if(fileFilter == null)
{
    System.out.println("I want a file filter!");
    return;
}
于 2013-11-03T02:03:34.670 回答
0

我想它就在这里。你在哪里创建directoryLister?它可能为空

while(file != null) //the following will be called when the File object is not null
{
      processFile(file, fileFilter);
      file = directoryLister.next();
}
于 2013-11-03T01:41:52.873 回答