Я не согласен с остальными, что переменная file
должна быть null
. Я не понимаю, почему listFiles()
должен возвращать массив, который содержит нулевые записи. Скорее, я думаю, что dir.listFiles()
само возвращает ноль, что и происходит, если он вызывается не в каталоге File
. Так что, возможно, вы должны попытаться сделать это только if dir.isDirectory()
, тогда как сейчас вы делаете это if (!dir.isFile())
.
UPDATE
Хорошо, собери все, что люди предложили в этой теме, это фрагмент, который имеет несколько нулевых проверок для нескольких неопределенностей.
private static long calcSize(File dir) {
if (dir == null) return 0;
if (dir.isFile()) return dir.length();
if (!dir.isDirectory()) return 0;
File[] files = dir.listFiles();
if (files == null) return 0;
long size = 0;
for (File file : files) {
if (file == null) continue;
if (file.isFile())
size += file.length();
else
size += calcSize(file);
}
return size;
}
Посмотрите, работает ли это для вас, и если вы все еще заинтересованы, вы можете удалить одну страховочную сетку за раз, чтобы увидеть, куда попадает NPE.