зачем проверять if(fos!=null)

191
25 февраля 2019, 06:40

Учу андроид разработку. И уведел такую штуку:

FileOutputStream fos = null;
    try {
        EditText textBox = (EditText) findViewById(R.id.save_text);
        String text = textBox.getText().toString();
        fos = openFileOutput(FILE_NAME, MODE_PRIVATE);
        fos.write(text.getBytes());
        Toast.makeText(this, "Файл сохранен", Toast.LENGTH_SHORT).show();
    }
    catch(IOException ex) {
        Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
    }
    finally{
        try{
            if(fos!=null)
                fos.close();
        }
        catch(IOException ex){
            Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
        }
    }
}

Вопрос, зачем мы проверяем (fos!=null), что если просто закрыть без проверки. ?!)

Answer 1

Первоначальное значение fos - это null:

FileOutputStream fos = null;

Если при создании fos

fos = openFileOutput(FILE_NAME, MODE_PRIVATE)

будет выброшено исключение, то в качестве значения fos так и останется null.
Соответственно, если в блоке finally (который выполнится и в случае появления исключения) не добавить проверку fos на null, то попытка вызвать close у null-a приведёт к NullPointerException, который в данном коде не отлавливается и приведёт к падению всего приложения

Можно заменить catch (IOException ex) на catch (Exception ex) в блоке finally, чтобы отлавливать и NPE, но, на мой взгляд, явная проверка лучше

А ещё лучше воспользоваться конструкцией try-with-resources, чтобы доверить закрытие ресурсов системе:

try (FileOutputStream  fos = openFileOutput(FILE_NAME, MODE_PRIVATE))
{
    EditText textBox = (EditText) findViewById(R.id.save_text);
    String text = textBox.getText().toString();
    fos.write(text.getBytes());
    Toast.makeText(this, "Файл сохранен", Toast.LENGTH_SHORT).show();
}
catch (IOException ex)
{
    Toast.makeText(this, ex.getMessage(), Toast.LENGTH_SHORT).show();
}

Единственное - в Android конструкция try-with-resources доступна с API level 19

READ ALSO
Считывание файла в массив Java [закрыт]

Считывание файла в массив Java [закрыт]

Есть файл, содержавший число: testtxt

124
&& и || и их братья & и | в разных ситуациях. Какие у них различия?

&& и || и их братья & и | в разных ситуациях. Какие у них различия?

друзья! Хотелось бы спросить про && и ||Если используется двойной амперсанд и первое выражение ложно (false), то второе выражение даже не будет...

144
Поворачивать маркер в mapsforge

Поворачивать маркер в mapsforge

У меня есть направление движения и точки трека

128
Google Maps перемещение к объекту из списка

Google Maps перемещение к объекту из списка

Есть приложение с использованием Google MapsИ в нем есть список озер

132