2013-11-03 1 views
1

내 프로그램을 실행하려고 할 때 null 포인터 예외 문제가 발생했습니다.내 프로그램이 NullPointerException을 throw하는 것을 막는 방법을 알아내는 데 도움이 필요합니다.

지금 제가하고있는이 프로그램은 아직 작업하고있는 프로그램의 또 다른 확장입니다.

이 부분에서는 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); 
    } 
} 

이 프로그램의 FileFilter를 모두 값을 실행하고 내에는 processFile() 메서드 내 파일 널 포인터 예외를 반환됩니다

여기 내 코드입니다.

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) 
+1

어떤 코드 줄이'DirectorySize.java : 71'입니까? 대부분의 NPE의 경우, 사용하고있는 변수가 null인지, 언제 사용할지 알려주는 것이 중요합니다. –

+2

그렇다면 71 행이'filter = fileFilter.accept (file);'(그렇습니까?)라면 fileFilter는 null입니까? – flup

+0

@ samfisher 나는 당신이 그것을 못질했다고 생각합니다. 대답으로 게시 할 수도 있습니다. –

답변

1

이 널 그냥 나중에 해당 개체를 사용하려고, 그것은 콘솔과 계속 인쇄하는 경우 fileFilter가 null의 경우 검사하는 null이 될 수 있습니다. 당연히, 그것은 NullPointerException을 던질 것입니다. 그 경우 if (또는 null fileFilter를 processFile 메서드에 전달하지 않았는지 확인하십시오.)로 반환 할 수 있습니다. 이렇게 :

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

확인. 나는 그것을했으며, 디렉토리에있는 모든 것을 null로 표시합니다. 이제 뭐? –

+0

@DanCzarnecki -'if (file == null) '과 똑같은 문제가 있습니다 - NPE에 대한 또 다른 후보자 –

+0

제가 간과 한 것이 었습니다. 그것은 초기화가있는 것입니다. 이제 모든 것이 작동합니다. –

0

내가 여기 생각 :
는 여기에 내가 무엇입니까 자세한 오류 메시지입니다. 디렉토리를 어디에서 생성합니까? 그것은

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

DirectoryLister는 내 DirectorySize 클래스가 하위 클래스 인 내 DirectoryProcessor 클래스에서 만들어집니다. –

관련 문제