Как использовать инструкцию Java try с ресурсами

Как использовать Java try Statement with Resources - dummies

Представьте себе программу 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 автоматически отключит соединения. Жизнь хорошая.