この問題に対処することで得た幸運を分かち合いたいと思いました。私は JDK 1.6.0_23 を使用しているため、NIO2 の恩恵を受けることができません。Windows 7 /x64 のみで構築および実行しているため、他の環境では走行距離が異なる場合があります。残念ながら、ここでの他の解決策は、ジャンクションをトラバースしようとしたときに発生する NullPointerExceptions を回避するのにうまくいきませんでした (おそらくジャンクション != symlink .... が原因です)。私は JDK のバージョンに制約されていませんが、もう少しこの問題を扱い続けることにしました。
シンボリック リンクで使用した場合、または「システム ボリューム情報」ディレクトリに遭遇した場合に、NullPointerException を引き起こすこのコードがありました。(traverseItem.f() は java.io.File 型のオブジェクトを返すことに注意してください)
if (traverseItem.f().isDirectory) {
for (File item : traverseItem.f().listFiles()) {
したがって、おそらくディレクトリですが、その上で listFiles() を呼び出すと NPE が発生します。何をすべきか?list() メソッドを調べて、同じ動作を示すかどうか疑問に思いました。私が発見したのは次のことでした。
空のフォルダーを記述する File で list() を呼び出すと、長さゼロの String[] 配列が返されます。ただし、ジャンクションを記述する File で list() を呼び出すと、それ以外の場合は listFiles() からクラッシュするため、null が返されます。
listFiles() を呼び出す前に次のテストを追加することで、NullPointerExceptions を回避できました。
String[] contents = traverseItem.f().list();
if (contents != null) { //Non-traversible if null, possibly junction or ???
ジャンクション、シンボリック リンク、ハード リンクのすべてのケースを徹底的にテストする必要があります。