我需要帮助找出如何阻止我的程序抛出NullPointerException

时间:2013-11-03 01:32:21

标签: java nullpointerexception

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

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

在这部分中,我刚刚添加了一个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)

2 个答案:

答案 0 :(得分:1)

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

if(fileFilter == null)
{
    System.out.println("I want a file filter!");
    return;
}

答案 1 :(得分:0)

我认为它就在这里。你在哪里创建directoryLister?它可能是null

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