Ошибка: FileOutputStream не может быть инициализирован - PullRequest
0 голосов
/ 11 октября 2010

Я пытаюсь запустить этот фрагмент кода внутри моего метода onCreate в качестве начального теста для записи личных данных для использования моим приложением. Этот код прямо из руководства по разработке Android SDK, расположенного здесь

String FILENAME = "hello_file";
String string = "hello world!";

FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();

Однако, этот код дает мне ошибки для 3 строк кода внизу. Ошибка является необработанным исключением. Предлагаемое быстрое исправление заключается в следующем:

    String FILENAME = "hello_file";
    String string = "hello world!";

    FileOutputStream fos;
    try {
        fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        fos.write(string.getBytes());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        fos.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Но после этого я получаю сообщение об ошибке для двух нижних строк, в котором говорится, что fos не может быть инициализирован. Как я могу исправить этот код?

Ответы [ 2 ]

2 голосов
/ 11 октября 2010

Заменить

FileOutputStream fos;

на

FileOutputStream fos = null;
1 голос
/ 11 октября 2010

Да, проблема здесь в том, что если вы получаете FileNotFoundException, вы пытаетесь просто распечатать исключение и продолжить, но в этом случае переменной fos никогда не будет присвоено значение, так как вызов "openFileOutput" не будетт завершено.Это хорошо, потому что в случае, когда вы не смогли открыть файл, вы не хотите продолжать пытаться записать файл, который вы не открыли.

, поскольку FileNotFoundException являетсяIOException, вы могли бы упростить все это как:

String FILENAME = "hello_file";
String string = "hello world!";

try {
    FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
    fos.write(string.getBytes());
    fos.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

В этом случае первое, что вызывает исключение, приводит к печати трассировки стека, и вы пропускаете любые последующие операции в оставшейся части попытки{} блок.

Проблема с ответом цемента состоит в том, что, хотя он и получает ошибку компилятора, если первый блок когда-либо выдает исключение, второй блок выдаст вам исключение NullPointerException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...