1

今日、私はハードディスク上のファイルを見つけるための小さなJavaプログラムを作成しました。これは、Windowsに適切なファイルがないことと、楽しみのためだったことが理由の1つです。ディレクトリのすべての子を単純に繰り返し、ディレクトリの場合はすべての子を再帰的に繰り返します。しかし、それから私は持っていましたNullPointerException。いくつかSystem.out.println()'sと私はこれが、、、try-catch blockのようないくつかのディレクトリで起こったことを知りました。エクスプローラーのアドレスバーに「アクセスが拒否されました」と入力すると、Windows自体が表示します。探索すると、ロックされているように見えます。からのソースは私に言います:D:\System Volume InformationC:\Users\Public\Documents\My VideosC:\ProgramData\Templatesjava.io.File

public File[] listFiles() {
    String[] ss = list();
    if (ss == null) return null; //This line seems to cause the NPE
    int n = ss.length;
    File[] fs = new File[n];
    for (int i = 0; i < n; i++) {
        fs[i] = new File(ss[i], this);
    }
    return fs;
}

私の質問は、なぜ適切な発言、、、IOExceptionまたはSecurityExceptionさえないのIDontCareWhatKindOfExceptionButPleaseNoNullPointerExceptionExceptionですか?

私はただtry-catchのためNPEsに、またはチェックすることができることを知っていますnull、しかし私はなぜ適切Exceptionに投げられないのか本当に興味があります。

私はコードの美的価値のために嫌いtry/catchでチェックしているので、いくつかのメソッドをエミュレートするnull厄介で厄介なリフレクションコード(偽善的なブロックがたくさんある)を作成しました。。そして、私はいくつかのWindowsファイルを気にしないので、このコードを使用してそれらを単に無視し、私に空を与えます:try/catchjava.io.Filejava.io.FileSystemarray

public static File[] listFiles(File mThis) {
    String[] ss = list(mThis);
    if (ss == null) {
        //System.out.println("ss is null");
        return new File[] {};
    }
    int n = ss.length;
    File[] fs = new File[n];
    for (int i = 0; i < n; i++) {
        fs[i] = getNewFile(ss[i], mThis);
    }
    return fs;
}

編集:誤解を避けるために:私使用しますtry/catch、私は単にそれらを美的に好きではありません。

EDIT2:コマンドプロンプトよりもGUIを使用したいです。そして、私はWindowsSearchGUIが非常に嫌いです。使うのはほとんど苦痛です。

4

2 に答える 2

3

短い答え:

  • JDK7をインストールします。
  • 新しいFilesAPIを使用します。

その後は二度と戻ってこないでしょうFile

于 2013-01-11T19:18:15.780 に答える
2

その理由は、APIの設計者が関数のコントラクト(ドキュメント+署名)で理由を正しく特定したためです。

この抽象パス名がディレクトリを示さない場合、このメソッドはnullを返します。それ以外の場合は、ディレクトリ内のファイルまたはディレクトリごとに1つずつ、Fileオブジェクトの配列が返されます。ディレクトリ自体とディレクトリの親ディレクトリを示すパス名は結果に含まれません。結果の各抽象パス名は、File(File、String)コンストラクターを使用してこの抽象パス名から作成されます。したがって、このパス名が絶対パスである場合、結果の各パス名は絶対パス名になります。このパス名が相対パスの場合、結果の各パス名は同じディレクトリからの相対パスになります。

nullを返し、具体的な理由を示します。

コードの美的価値のために、try/catchとnullのチェックが嫌いなので

これはAPIの「欠点」である可能性がありますが、露骨に無視したため、プログラムがクラッシュします。

于 2013-01-11T19:09:11.593 に答える