#java
#java
Вопрос:
Пример кода взят с официального сайта Java по ссылке:https://docs.oracle.com/javase/tutorial/essential/io/bytestreams.html
В следующих строках кода я не понял
1) почему объекту FileInputStream изначально присвоено значение null? 2) логика условия if в блоке finally
public Class A{
public static void main(String[] args){
FileInputStream in = null;
FileOutputStream out = null;
try {
in = new FileInputStream("xanadu.txt");
out = new FileOutputStream("outagain.txt");
int c;
while ((c = in.read()) != -1) {
out.write(c);
}
}
finally {
if (in != null) {
in.close();
}
if (out != null) {
out.close();
}
}
}
}
Комментарии:
1. 1. Попробуйте удалить инициализацию с помощью null и скомпилировать код, и вы поймете почему. 2. Если FileInputStream() выдает исключение, каким будет значение
in
иout
в блоке finally? Что произойдет, если он не проверит значение null? Примечание: это не имеет абсолютно никакого отношения к «проверке конца файла».2. Вы можете написать код, который делает то же самое, используя
try (FileOutputStream out = new FileOutputStream("outagain.txt"), FileInputStream in = new FIleInputStream("xanadu.txt")) { ... } catch (IOException e) { ... }
инструкцию, для которой не нуженfinally
блок.3. Этот пример кода, должно быть, был написан более 10 лет назад, до того, как была доступна инструкция try-with-resources. Теперь вам не следует кодировать это подобным образом и вместо этого следует использовать try-with-resources .
4. что здесь делает оператор while((c =in.read() !=-1)? в блоке while также не используется операция увеличения… не могли бы вы, пожалуйста, помочь мне понять
Ответ №1:
1) FileInputStream и FileOutputStream должны быть инициализированы некоторым значением. Поэтому они инициализируются с помощью null.
Они будут повторно инициализированы в вашем блоке try / catch. Таким образом, считываются два файла. Если этот процесс завершится неудачей, поскольку файлы не существуют, программа выйдет из блока try и выполнит «finally»-блок. В противном случае он выполнит цикл while и после этого выполнит блок finally.
2) Условие в вашем блоке finally сравнивает «in» с «null». Файлы закрываются только тогда, когда out / in не равен null. На первом шаге 1) мы устанавливаем для них значение null. Сравнивая их с null на этом этапе, мы можем увидеть, правильно ли сработало открытие файла.
Если это сработало правильно, in / out на данный момент не будет null, и, следовательно, у нас есть допустимый файл для закрытия. Если оно по-прежнему равно null, файл открылся некорректно и, следовательно, его не обязательно закрывать.
Этот процесс является типичной обработкой ошибок. Мы не хотим, чтобы программа завершила работу из-за невозможности чтения файла.