
Представьте себе программу Java, которая вводится из двух разных файлов или из Scanner
и диска файл. Чтобы убедиться, что вы правильно очищаете, вы помещаете вызов close
в предложение finally
.
импорт java. Ио. Файл;
импорт java. Ио. IOException;
импорт java. Util. сканер;
public class Main {
public static void main (String args []) {
Сканирование scan1 = null;
Сканер scan2 = null;
try {
scan1 = новый сканер (новый файл («Файл1. Txt»));
scan2 = новый сканер (новый файл («Файл2. Txt»));
// Полезный материал
} catch (IOException e) {
// Ой!
} наконец {
scan1. Закрыть();
scan2. Закрыть();
Система. вне. Println ( "Готово!");
}
}
}
Теоретически компьютер всегда выполняет scan1. закрыть ()
и scan2. close ()
независимо от того, что пойдет не так во время выполнения предложения try
. Но это теория. На самом деле другой программист (не вы, конечно) может изменить код, закрыв scan1
в середине try
:
попробуйте {
scan1 = новый сканер (новый файл ("File1. Txt"));
scan2 = новый сканер (новый файл («Файл2. Txt»));
// Делаем полезные вещи, но также ...
scan1. Закрыть();
scan1 = null;
} catch (IOException e) {
// Упс!
} наконец {
scan1. Закрыть();
scan2. Закрыть();
Система. вне. Println ( "Готово!");
}
Теперь у вас есть реальное затруднительное положение. Внутри finally
значение scan1
равно null
. Вызов scan1. close ()
завершается с ошибкой, поэтому программа выдает NullPointerException
и перестает работать до достижения вызова scan2. закрыть ()
. В худшем случае scan2
не закрывается, а ваша программа имеет File2. txt
заблокирован, чтобы никакая другая программа не могла использовать файл.
Когда программа использует несколько ресурсов (много файлов, базы данных и файла или что-то еще), сборка try
операторов становится довольно сложной. Вы можете сделать инструкцию
в рамках catch
предложений и всех видов сумасшедших комбинаций. Но у Java есть лучший способ решить проблему: в Java 7 (и более поздних версиях Java) вы можете создать инструкцию try-with-resources. Этот код показывает, как.
импорт java. Ио. Файл;
импорт java. Ио. IOException;
импорт java. Util. сканер;
public class NewMain {
public static void main (String args []) {
try (Сканер scan1 = новый сканер (новый файл («Файл1.txt "));
Сканер scan2 = новый сканер (новый файл (" File2. txt "))) {
// Полезный материал
} catch (IOException e) {
// Упс !
}
System. out. println («Done!»);
}
}
В этом коде объявления scan1
и scan2
находятся в круглых скобках после слова try
. В объявлении в скобках указано, что Java закрывает scan1
и scan2
автоматически после выполнения операторов в > try . Вы можете объявить несколько ресурсов внутри одной скобки
try . Когда вы это сделаете, Java автоматически закрывает все ресурсы после выполнения предложений
try . добавьте
catch предложения и
finally , если хотите. Вы можете получить доступ ко всем видам ресурсов (файлы, базы данных, подключения к серверам и т. д.) и иметь спокойствие, зная, что Java автоматически отключит соединения.
Жизнь хорошая.