繁体   English   中英

我需要帮助弄清楚如何阻止我的程序抛出NullPointerException

[英]I need help figuring out how to stop my program from throwing a 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)

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

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

我认为就在这里。 您在哪里创建directoryLister? 它可以为空

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM