尝试运行程序时,我遇到了一个令人讨厌的空指针异常问题。
我正在研究的这个程序是我正在研究的程序的另一个扩展。
在这部分中,我刚刚添加了一个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)
答案 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();
}