Чтение онлайн

на главную - закладки

Жанры

Философия Java3

Эккель Брюс

Шрифт:

Для чего нужен блок finally?

В языках без сборки мусора и без автоматических вызовов деструкторов18 блок finally гарантирует освобождение ресурсов и памяти независимо от того, что случилось в блоке try. В Java существует сборщик мусора, поэтому с освобождением памяти проблем не бывает. Также нет необходимости вызывать деструкторы, их просто нет. Когда же нужно использовать finally в Java?

Блок finally необходим тогда, когда в исходное состояние вам необходимо вернуть что-то другое, а не память. Это может быть, например, открытый файл или сетевое подключение, часть изображения на экране или даже какой-то физический переключатель, вроде смоделированного в следующем примере:

//: exceptions/Switch.java

import static net mindview.util.Print.*;

class Switch {

private boolean state = false; public boolean readO { return state, } public void on { state = true, print(this); } public void offО { state = false, print(this), } public String toStringO { return state ? "on" • "off"; } } ///.-

//. exceptions/OnOffException]..java

public class OnOffExceptionl extends Exception {} lll-

ll . exceptions/0n0ffException2.java

public class 0n0ffException2 extends Exception {} III ~

//• exceptions/OnOffSwitch java 11 Для чего нужно finally?

public class OnOffSwitch {

private static Switch sw = new SwitchO; static void f

throws OnOffExceptionl, 0n0ffException2 {} public static void main(String[] args) { try {

sw.onO;

// Код, способный возбуждать исключения... f;

sw off: } catch(OnOffExceptionl e) {

System.out.pri ntin("OnOffExcepti onl"); sw.offO; } catch(OnOffException2 e) {

System.out.pri ntin("OnOffExcepti on2"); sw.offO:

}

}

} /* Output-

on

off

*///:-

Наша цель — убедиться в том, что переключатель был выключен по завершении метода main, поэтому в конце блока try и в конце каждого обработчика исключения помещается вызов sw.off. Однако в программе может возникнуть неперехватываемое исключение, и тогда вызов sw.off будет пропущен. Однако благодаря finally завершающий код можно поместить в одном определенном месте:

II: exceptions/WithFinally.java 11 Finally гарантирует выполнение завершающего кода.

public class WithFinally {

static Switch sw = new SwitchO; public static void main(String[] args) { try {

sw.onO;

// Код, способный возбуждать исключения. OnOffSwitch.fO; } catch(OnOffExceptionl e) {

System out.printing"OnOffExceptionl"); } catch(OnOffException2 e) {

System out println( OnOffException2"); } finally {

sw.offO;

}

}

} /* Output:

on

off

*///:-

Здесь вызов метода sw.off просто перемещен в то место, где он гарантированно будет выполнен.

Даже если исключение не перехватывается в текущем наборе условий catch, блок finally отработает перед тем, как механизм обработки исключений продолжит поиск обработчика на более высоком уровне:

//: exceptions/AlwaysFinally.java

// Finally выполняется всегда

import static net.mindview.util Print.*:

class FourException extends Exception {}

public class AlwaysFinally {

public static void main(String[] args) {

print("Входим в первый блок try"), try {

print("Входим во второй блок try"): try {

throw new FourExceptionO, } finally {

print("finally во втором блоке try"):

}

} catch(FourException e) { System.out.println(

"Перехвачено FourException в первом блоке try"):

} finally {

System.out.println("finally в первом блоке try"):

}

}

} /^Output-

Входим в первый блок try Входим во второй блок try finally во втором блоке try Перехвачено FourException в первом блоке try finally в первом блоке try *///:-

Блок finally также исполняется при использовании команд break и continue. Заметьте, что комбинация finally в сочетании с break и continue с метками снимает в Java всякую необходимость в операторе goto.

Использование finally с return

Поскольку секция finally выполняется всегда, важные завершающие действия будут выполнены даже при возврате из нескольких точек метода:

//• excepti ons/Multi pleReturns java import static net.mindview util Print.*;

public class MultipleReturns {

public static void f(int i) {

pri nt("Инициализация. требующая завершения"), try {

print("Точка 1"), if(i == 1) return, print("Точка 2"); if(i == 2) return, print("Точка 3"), if(i == 3) return, print("Конец"), return; } finally {

ргШС'Завершение"),

}

}

public static void main(String[] args) { for (int i =1, i <=4; i++) f(i).

}

} /* Output;

Инициализация, требующая завершения

Точка 1

Завершение

Инициализация, требующая завершения Точка 1 Точка 2 Завершение

Инициализация, требующая завершения

Точка 1

Точка 2

Точка 3

Завершение

Инициализация, требующая завершения

Точка 1

Точка 2

Точка 3

Конец

Завершение *///;-

Из выходных данных видно, что выполнение finally не зависит от того, в какой точке защищенной секции была выполнена команда return.

Поделиться:
Популярные книги

Идеальный мир для Лекаря 15

Сапфир Олег
15. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 15

Звездная Кровь. Экзарх III

Рокотов Алексей
3. Экзарх
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Звездная Кровь. Экзарх III

Афганский рубеж 2

Дорин Михаил
2. Рубеж
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Афганский рубеж 2

Бояръ-Аниме. Газлайтер. Том 34

Володин Григорий Григорьевич
34. История Телепата
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 34

Последний Паладин. Том 9

Саваровский Роман
9. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 9

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Миллионщик

Шимохин Дмитрий
3. Подкидыш
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Миллионщик

Неудержимый. Книга XV

Боярский Андрей
15. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XV

Тринадцатый IV

NikL
4. Видящий смерть
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Тринадцатый IV

Черный Маг Императора 13

Герда Александр
13. Черный маг императора
Фантастика:
попаданцы
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Черный Маг Императора 13

Хозяин оков VI

Матисов Павел
6. Хозяин Оков
Фантастика:
фэнтези
попаданцы
гаремник
5.00
рейтинг книги
Хозяин оков VI

Шаман

Седой Василий
5. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Шаман

Петля, Кадетский Корпус. Книга четвертая

Алексеев Евгений Артемович
4. Петля
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Петля, Кадетский Корпус. Книга четвертая