1

本当に奇妙な NPE 例外が発生します。これは問題のあるコードです:

  private static int countRecurse(File file) {
        Preconditions.checkNotNull(file, "file argument");
        int entries = 0;
        for (File entry : file.listFiles()) {    //NPE on this line
            if (entry != null) {
                if (entry.isDirectory())
                    entries += countRecurse(entry);
                else
                    entries++;
            }

        }
        return entries;
    }

コメント行で NPE 例外が発生します。これは私が得たスタックトレースです:

java.lang.NullPointerException
        at controllers.StudyPreparation.countRecurse(StudyPreparation.java:103)
        at controllers.StudyPreparation.readDicomFiles(StudyPreparation.java:95)
        at controllers.StudyPreparation.access$100(StudyPreparation.java:30)
        at controllers.StudyPreparation$1.onReady(StudyPreparation.java:77)
        at play.core.j.JavaWebSocket$$anonfun$webSocketWrapper$1$$anonfun$apply$1.apply(JavaWebSocket.scala:48)
        at play.core.j.JavaWebSocket$$anonfun$webSocketWrapper$1$$anonfun$apply$

コードは Play フレームワーク アプリケーションの一部ですが、これが問題の一部である可能性はないと思います...ファイルの null を既にテストしているため、null になることはありません。listFiles() メソッド内で何か問題が発生した場合は、スタックトレースで確認できると思います。

では、何が問題になるのでしょうか?

編集:

ファイルがディレクトリかどうかを確認する問題は解決しました... file.listFiles() が null を返すため、NPE がスローされます。

また、javadocs に記載されていなくても、パスが存在しないため null が返されます。私の開発マシンでは手順がうまく機能しているため、確認しませんでした。問題は本番サーバーでのみ発生しますが、明らかにコードの他の部分に関連しています...

ご協力ありがとうございます。

4

2 に答える 2

3

file.listFiles() の javadoc から

Returns an array of abstract pathnames denoting the files in the directory 
denoted by this abstract pathname. 

If this abstract pathname does not denote a directory, then this method returns 
null. ...

file.isDirectory()使用する前に確認してくださいfile.listFiles()

于 2012-06-08T10:43:17.690 に答える
2

File がディレクトリではないためにfile.listFiles()が返される可能性があります。null

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

于 2012-06-08T10:48:03.460 に答える