Что вызывает исключение NullPointerException во время finalize () FileInputStream в Android? - PullRequest
0 голосов
/ 16 ноября 2011

Я преобразую наше приложение от использования внешних файлов (доступ с помощью имен файлов) к внутренним (доступ с использованием объектов FileInputStream и FileOutputStream).Тем не менее, я получаю довольно странную ошибку: на finalize(), FileInputStream s иногда выдают NullPointerException.

logcat говорит мне:

Uncaught exception thrown by finalizer (will be discarded):
java.lang.NullPointerException:
at java.io.FileInputStream.close(FileInputStream.java:133)
at java.io.FileInputStream.finalize(FileInputStream.java:156)
at dalvik.system.NativeStart.run(Native Method)

Глядя на FileInputStream source на docjar.com кажется вероятным, что это может быть вызвано нулем FileDescriptor;тем не менее, я хочу иметь возможность передавать неверные имена файлов моим конструкторам FileInputStream и ловить FileNotFoundException, поскольку это все, что я могу сделать с внутренней системой Android (если не считать измерения имени файла для каждой записи в Context#fileList()).Есть ли способ обойти эту проблему?

Примечание: очевидно, что исключение в финализаторе не вызывает у меня реальных сбоев, но я чувствую, что должен попытаться привести в порядок это.

1 Ответ

1 голос
/ 16 ноября 2011

Вы должны вручную вызывать close в своих потоках, потому что не обязательно вызывать finalize. В этом случае (если только closeLock не обнуляется до вызова finalize), NPE будет избегаться.

Если вы используете Context.openFileInput / Output; Вы можете проверить, существует ли файл:

File f = new File(context.getFilesDir(), filename);
if(!f.exists()) {
    //ohnoes!
}

Если вы используете AssetManager.open (); Я думаю, что вы можете сделать что-то вроде:

File f = new File("file:///android_asset/" + filename);
if(!f.exists()) {
    //ohnoes!
}
...