5

ファイルまたはディレクトリを検索するプログラムを作成しました。ディレクトリの 例
でファイルを検索しようとすると正常に動作し ますが、ローカルドライブ からファイルを検索しようとすると、すべての検索結果を表示した 後に例外がスローされ、NullPointerException がスローされます。

java FileSearch abc.txt f:\xyz

java FileSearch abc.txt f:\

nullポインタ例外

コードは:

import java.io.*;
class FileSearch{
static String fd;
static boolean flg=true;
public static void main(String arr[]){
    fd=arr[0];
    String path=arr[1];
    String dir[]=new File(path).list();
    new FileSearch().finder(dir,path);
    if(flg){System.out.print("File not found.");}
}
public void finder(String[] dir,String path){
    for(int i=0;i<dir.length;i++){
        if(dir[i].equals(fd)){
            System.out.println(path+"\\"+fd);
            flg=false;
        }
        if(new File(path,dir[i]).isDirectory())
            finder(new File(path,dir[i]).list(),path+"\\"+dir[i]);
    }   
}
}

この例外がスローされる理由と、それを修正する方法を知りたいです。

4

3 に答える 3

10

リスト()

この抽象パス名がディレクトリを示さない場合、または I/O エラーが発生した場合listFiles()に返されることが言及されているドキュメント。nullさらに、 file.canRead()アプリケーションがディレクトリを読み取れるかどうかを確認する必要があります。

私見では

常にこのように使用してください。

String[] files = file.list();
if (files!=null) {
    for (String f : files) processFile(f);
}

これをお勧めします。

File directory = new File(directoryName);

//get all the files from a directory
File[] fList = directory.listFiles();

if(fList != null){
    for (File file : fList){
        if (file.isFile()){
            System.out.println(file.getName());
        }
    }
}

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-09-13T20:54:16.953 に答える
0

これを修正する方法は次のとおりです。

import java.io.*;
class FileSearch{
static String fd;
static boolean flg=true;
public static void main(String arr[]){
    fd=arr[0];
    String path=arr[1];
    String dir[]=new File(path).list();
    new FileSearch().finder(dir,path);
    if(flg){System.out.print("File not found.");}
}
public void finder(String[] dir,String path){
    if(dir == null){
        return;
    }
    for(int i=0;i<dir.length;i++){
        if(dir[i].equals(fd)){
            System.out.println(path+"\\"+fd);
            flg=false;
        }
        if(new File(path,dir[i]).isDirectory())
            finder(new File(path,dir[i]).list(),path+"\\"+dir[i]);
    }   
}
}

なんで?文字列 dir[]=新しいファイル(パス).list(); 指定したディレクトリがnullであるため、dir.lengthを呼び出すとnullポインタ例外が発生します

System.out.print(new File(path).isDirectory()); を理解するのに役立つもう 1 つのこと。false の場合は、null ポインター例外が発生します。

于 2013-09-21T02:34:29.350 に答える