Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Ѐилософия Java3Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 69

Автор Π‘Ρ€ΡŽΡ ЭккСль

Π•ΡΡ‚ΡŒ цСлая Π³Ρ€ΡƒΠΏΠΏΠ° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… ΠΊ этой ΠΊΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΠΈ. Они всСгда Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² Java автоматичСски, ΠΈ Π²Π°ΠΌ Π½Π΅ придСтся Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈΡ… Π² ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. ВсС ΠΎΠ½ΠΈ унаслСдованы ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ класса RuntimeException, Ρ‡Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ ΠΈΠ΄Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ наслСдования: сСмСйство классов, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ‰ΠΈΠ΅ характСристики ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Π’Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ придСтся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π½Π° Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ RuntimeException (ΠΈΠ»ΠΈ любого унаслСдованного ΠΎΡ‚ Π½Π΅Π³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ), Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ эти ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ относятся ΠΊ Π½Π΅ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ (unchecked). Π’Π°ΠΊΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ ошибки Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΈ фактичСски Π²Π°ΠΌ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ придСтся ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈΡ… β€” это дСлаСтся автоматичСски. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° RuntimeException ΠΏΡ€ΠΈΠ²Π΅Π»Π° Π±Ρ‹ ΠΊ ΠΈΠ·Π»ΠΈΡˆΠ½Π΅ΠΌΡƒ Π·Π°Π³Ρ€ΠΎΠΌΠΎΠΆΠ΄Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. И хотя Π²Π°ΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ трСбуСтся ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ RuntimeException, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ посчитаСтС Π½ΡƒΠΆΠ½Ρ‹ΠΌ Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· Π½ΠΈΡ… Π² своих собствСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π§Ρ‚ΠΎ ΠΆΠ΅ происходит, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ΡΡ? Π’Π°ΠΊ ΠΊΠ°ΠΊ компилятор Π½Π΅ заставляСт ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² спСцификациях, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ RuntimeException ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ½Π΅Ρ‚ прямо Π² ΠΌΠ΅Ρ‚ΠΎΠ΄ mainQ, ΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‡Π΅Π½ΠΎ. Π§Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ всС Π² дСйствии, испытайтС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ†Ρ€ΠΈΠΌΠ΅Ρ€:

//: exceptions/NeverCaught java

// Π˜Π³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ RuntimeExceptions.

// {ThrowsException}

public class NeverCaught {

static void f() {

throw new RuntimeException("H3 f(D;

}

static void g() { f();

}

public static void mainCString[] args) {

g():

}

} ///.-

МоТно сразу Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ RuntimeException (ΠΈ всС ΠΎΡ‚ Π½Π΅Π³ΠΎ унаслСдованноС) являСтся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ случаСм, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ компилятор Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ для Π½Π΅Π³ΠΎ спСцификации ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ выводятся Π² System.err:

Exception in thread "main" java.lang.RuntimeException- Из f() at NeverCaught.f(NeverCaught.java:7) at NeverCaught.g(NeverCaught.java:10) at NeverCaught.main(NeverCaught.java-13)

ΠœΡ‹ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΎΡ‚Π²Π΅Ρ‚Ρƒ Π½Π° поставлСнный вопрос: Ссли RuntimeException добираСтся Π΄ΠΎ main() Π±Π΅Π· ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π°, Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° printStackTraceO.

ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠ° RuntimeException (ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹Ρ… классов) ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π²ΠΎ врСмя написания тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ дСйствия компилятор осущСствляСт Π² ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΌ порядкС. Π­Ρ‚ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ RuntimeException являСтся слСдствиСм ошибки программиста, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

β€’ ΠΎΡˆΠΈΠ±ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Ρ‚ΡŒ (ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ null-ссылки Π² вашСм ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅, ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠΉ снаруТи);

β€’ ΠΎΡˆΠΈΠ±ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΊΠ°ΠΊ программист Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Π»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π² вашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ ArraylndexOutOfBoundsException, с ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° массива). Ошибки ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π° часто становятся ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ошибок Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°.

Π’ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ситуациях ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π΅ΠΎΡ†Π΅Π½ΠΈΠΌΡƒΡŽ ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π² ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΠΎΠΌ процСссС.

ΠΠ°Π·Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ Java узкоспСциализированным инструмСнтом Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅Π²Π΅Ρ€Π½ΠΎ. Π”Π°, ΠΎΠ½ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с досадными ошибками Π½Π° стадии исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π·Π°Ρ€Π°Π½Π΅Π΅, Π½ΠΎ ΠΏΡ€ΠΈ этом Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²Ρ‹ΡΠ²Π»ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ошибки программирования, выходящиС Π·Π° ΠΏΡ€Π΅Π΄Π΅Π»Ρ‹ возмоТностСй компилятора.

Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ finally

Часто встрСчаСтся ситуация, ΠΊΠΎΠ³Π΄Π° нСкоторая Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π±Ρ‹Π»ΠΎ ΠΈΠ»ΠΈ Π½Π΅Ρ‚ Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π²Π½ΡƒΡ‚Ρ€ΠΈ Π±Π»ΠΎΠΊΠ° try. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ это ΠΈΠΌΠ΅Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ ΠΊ опСрациям, Π½Π΅ связанным с освобоТдСниСм памяти (Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² обязанности сборщика мусора). Для достиТСния ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠΉ Ρ†Π΅Π»ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ finally17 послС всСх ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, полная конструкция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ выглядит Ρ‚Π°ΠΊ:

try {

// ЗащищСнная сСкция: рискованныС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, // ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΡ€ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ А, Π’. ΠΈΠ»ΠΈ Π‘ } catch(A al) {

// ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для ситуации А } catch(B Π«) {

// ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для ситуации Π’ } catch(C cl) {

// ΠžΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ для ситуации Π‘ } finally {

// ДСйствия, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π² любом случаС

}

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π±Π»ΠΎΠΊ finally выполняСтся всСгда, рассмотрим ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ:

//: exceptions/FinallyWorks.java // Π‘Π»ΠΎΠΊ finally выполняСтся всСгда

class ThreeException extends Exception {}

public class FinallyWorks { static int count = 0; public static void main(String[] args) { while(true) { try {

// ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ постфиксного приращСния, Π² ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π· 0: if(count++ == 0)

throw new ThreeExceptionO; System.out.println("НСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ"); } catch(ThreeException e) {

System.out.pri ntln("ThreeExcepti on"); } finally {

System.out.println("B Π±Π»ΠΎΠΊΠ΅ finally"); if(count == 2) break; // Π²Π½Π΅ Ρ†ΠΈΠΊΠ»Π° "while"

}

}

}

} /* Output: ThreeException Π’ Π±Π»ΠΎΠΊΠ΅ finally НСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π’ Π±Π»ΠΎΠΊΠ΅ finally *///-

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Π½Π΅ зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, Π±Ρ‹Π»ΠΎ Π»ΠΈ Π²ΠΎΠ·Π±ΡƒΠΆΠ΄Π΅Π½ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ finally выполняСтся всСгда.

Π”Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΆΠ΅ подсказываСт, ΠΊΠ°ΠΊ ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒΡΡ с Ρ‚Π΅ΠΌ Ρ„Π°ΠΊΡ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Java Π½Π΅ позволяСт Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ мСсту возникновСния ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, ΠΎ Ρ‡Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅. Если Ρ€Π°ΡΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊ try Π² Ρ†ΠΈΠΊΠ»Π΅, ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ условиС, Π½Π° основании ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΎ, Π΄ΠΎΠ»ΠΆΠ½Π° Π»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Ρ‚ΡŒΡΡ. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ статичСский счСтчик ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΡ‚ΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ восстановлСния. Π­Ρ‚ΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· способов обСспСчСния ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½Π½ΠΎΠΉ отказоустойчивости ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Для Ρ‡Π΅Π³ΠΎ Π½ΡƒΠΆΠ΅Π½ Π±Π»ΠΎΠΊ 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 Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰Π°Ρ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ