Неперехваченное исключение
Неперехваченное исключение
Контролируемые и неконтролируемые исключения и ошибки
Контролируемые исключения
Почему контролируемые исключения?
Неконтролируемые исключения
Предотвращение неконтролируемых исключений
Предотвращение неконтролируемых исключений
Контролируемые исключения
Попытка предотвратить контролируемое исключение
Попытка предотвратить контролируемое исключение
Перехватывание исключений
Перехватывание исключений
Перехватывание контролируемого исключения
Множественные операторы catch
Множественные операторы catch
Множественные операторы catch
Множественные операторы catch
Блок finally
Завершение с помощью finally
Блок finally
Блок finally
Завершение с помощью finally
Блок finally без catch
Блок finally без catch
Блок finally и операторы перехода управления
Блоки finally
Блоки finally
Замена исключения
Исчезновение исключения
Замена возвращаемого значения
Конструкторы и блоки инициализации
Исключение в конструкторе
Исключение в конструкторе
Исключение в статическом блоке инициализации
Исключение в статическом блоке инициализации
1.31M
Категория: ПрограммированиеПрограммирование

Исключения. Использование исключений

1.

2.

VI. Исключения
1. Использование исключений
2

3.

Исключительная ситуация - ошибка времени выполнения из-за
которой нормальное продолжение работы выполняемого метода
становится невозможным. Когда возникает исключительная ситуация
среда выполнения (runtime enviroment) или код обнаруживший ошибку
“выбрасывает” исключение. Выбрасывание исключения даёт
возможность изменить путь выполнения программы когда происходит
исключительная ситуация.
Исключение - объект описывающий исключительную ситуацию.
Исключения могут создаваться и выбрасываться средой выполнения
(runtime enviroment) или программой. Исключение как правило
содержит достаточно информации чтобы указать на то где ошибка
произошла, какая ошибка произошла и данные которые привели к
ошибке или которые указывают на ошибку.
3

4. Неперехваченное исключение

public
public class
class NoCatchDemo
NoCatchDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
System.out.println("Enter
System.out.println("Enter main()");
main()");
int
int result
result == 11 // 0;
0;
System.out.println("Exit
System.out.println("Exit main()");
main()");
}}
}}
Enter
Enter main()
main()
Exception
Exception in
in thread
thread "main"
"main" java.lang.ArithmeticException:
java.lang.ArithmeticException: // by
by zero
zero
at
at usage.NoCatchDemo.main(NoCatchDemo.java:7)
usage.NoCatchDemo.main(NoCatchDemo.java:7)
4

5.

Стек вызовов
5

6.

6

7. Неперехваченное исключение

public
public class
class CallStackDemo
CallStackDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
System.out.println("Enter
System.out.println("Enter main()");
main()");
methodA();
methodA();
System.out.println("Exit
System.out.println("Exit main()");
main()");
}}
public
public static
static void
void methodA()
methodA() {{
System.out.println("Enter
System.out.println("Enter methodA()");
methodA()");
methodB();
methodB();
System.out.println("Exit
System.out.println("Exit methodA()");
methodA()");
}}
public
public static
static void
void methodB()
methodB() {{
System.out.println("Enter
System.out.println("Enter methodB()");
methodB()");
methodC();
methodC();
System.out.println("Exit
System.out.println("Exit methodB()");
methodB()");
}}
}}
public
public static
static void
void methodC()
methodC() {{
System.out.println("Enter
System.out.println("Enter methodC()");
methodC()");
int
int result
result == 11 // 0;
0;
System.out.println("Exit
System.out.println("Exit methodC()");
methodC()");
}}
Enter
Enter main()
main()
Enter
methodA()
Enter methodA()
Enter
Enter methodB()
methodB()
Enter
Enter methodC()
methodC()
Exception
Exception in
in thread
thread "main"
"main" java.lang.ArithmeticException:
java.lang.ArithmeticException: // by
by zero
zero
at
at usage.CallStackDemo.methodC(CallStackDemo.java:28)
usage.CallStackDemo.methodC(CallStackDemo.java:28)
at
usage.CallStackDemo.methodB(CallStackDemo.java:22)
at usage.CallStackDemo.methodB(CallStackDemo.java:22)
at
at usage.CallStackDemo.methodA(CallStackDemo.java:16)
usage.CallStackDemo.methodA(CallStackDemo.java:16)
at
at usage.CallStackDemo.main(CallStackDemo.java:10)
usage.CallStackDemo.main(CallStackDemo.java:10)
7

8.

Контролируемые и неконтролируемые
исключения
8

9. Контролируемые и неконтролируемые исключения и ошибки

Исключения делятся на контролируемые и неконтролируемые.
Классы неконтролируемых исключений являются потомками класса
RuntimeException или класса Error. Классы контролируемых
исключений являются потомками класса Exception, но не являются
потомками класса RuntimeException. Контролируемые исключения
которые метод может выбрасывать должны указываться с помощью
ключевого слова throws при объявлении метода. Компилятор
контролирует что контролируемые исключения которые могут быть
выброшены в методе перехватываются или объявляются с помощью
ключевого слова throws.
Неконтролируемые исключения включают ошибки - классы потомки
класса Error. Исключения типа Error используются средой выполнения
Java для обозначения ошибок происходящих внутри самой среды.
Обычно они создаются в ответ на катастрофические сбои после
которых программа не может продолжить выполнение.
9

10. Контролируемые исключения

10

11.

11

12.

12

13.

Почему контролируемые исключения?
13

14. Почему контролируемые исключения?

Выбрасывание неконтролируемых исключений (за исключением
потомков класса Error) можно предотвратить и они означают ошибку
разработчика. Контролируемые исключения связаны с состоянием
среды в которой программа выполняется и их нельзя предотвратить.
Таким образом компилятор заставляет программу быть готовой к
непредотвратимым ситуациям связанным с состоянием среды и
программа надёжна.
14

15. Неконтролируемые исключения

public
public class
class UncheckedDemo
UncheckedDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Scanner
Scanner input
input == new
new Scanner(System.in);
Scanner(System.in);
System.out.println("Enter
System.out.println("Enter first
first number:
number: ");
");
int
n1
=
input.nextInt();
int n1 = input.nextInt();
System.out.println("Enter
System.out.println("Enter second
second number:
number: ");
");
int
int n2
n2 == input.nextInt();
input.nextInt();
}}
}}
int
int result
result == n1
n1 // n2;
n2;
System.out.println("The
System.out.println("The result
result is:
is: "" ++ result);
result);
Enter
Enter first
first number:
number:
10
10
Enter
Enter second
second number:
number:
abcdef
abcdef
Exception
Exception in
in thread
thread "main"
"main" java.util.InputMismatchException
java.util.InputMismatchException
at
at java.util.Scanner.throwFor(Unknown
java.util.Scanner.throwFor(Unknown Source)
Source)
at
at java.util.Scanner.next(Unknown
java.util.Scanner.next(Unknown Source)
Source)
at
at java.util.Scanner.nextInt(Unknown
java.util.Scanner.nextInt(Unknown Source)
Source)
at
java.util.Scanner.nextInt(Unknown
Source)
at java.util.Scanner.nextInt(Unknown Source)
at
at usage.UncheckedNoCatchDemo.main(UncheckedNoCatchDemo.java:15)
usage.UncheckedNoCatchDemo.main(UncheckedNoCatchDemo.java:15)
15

16. Предотвращение неконтролируемых исключений

public
public class
class UncheckedPreventDemo
UncheckedPreventDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Scanner
Scanner input
input == new
new Scanner(System.in);
Scanner(System.in);
System.out.println("Enter
System.out.println("Enter first
first number:
number: ");
");
while
while (!input.hasNextInt())
(!input.hasNextInt()) {{
input.next();
input.next();
System.out.println("Wrong
System.out.println("Wrong format
format .....
..... \nEnter
\nEnter first
first number:
number: ");
");
}}
int
int n1
n1 == input.nextInt();
input.nextInt();
System.out.println("Enter
System.out.println("Enter non-zero
non-zero second
second number:
number: ");
");
int
int n2
n2 == 0;
0;
do
{
do {
while
while (!input.hasNextInt())
(!input.hasNextInt()) {{
input.next();
input.next();
System.out.println("Wrong
System.out.println("Wrong format
format .....
..... \nEnter
\nEnter second
second number:
number: ");
");
}}
n2
n2 == input.nextInt();
input.nextInt();
if
if (n2
(n2 ==
== 0)
0)
System.out.println("Second
System.out.println("Second number
number can
can not
not be
be zero
zero .....
..... \nEnter
\nEnter second
second number:
number: ");
");
}} while
while (n2
(n2 ==
== 0);
0);
}}
}}
int
int result
result == n1
n1 // n2;
n2;
System.out.println("The
System.out.println("The result
result is:
is: "" ++ result);
result);
16

17. Предотвращение неконтролируемых исключений

Enter
Enter first
first number:
number:
abcde
abcde
Wrong
Wrong format
format .....
.....
Enter
first
number:
Enter first number:
125
125
Enter
Enter non-zero
non-zero second
second
fghij
fghij
Wrong
Wrong format
format .....
.....
Enter
non-zero
Enter non-zero second
second
00
Second
Second number
number can
can not
not
Enter
Enter non-zero
non-zero second
second
55
The
The result
result is:
is: 25
25
number:
number:
number:
number:
be
be zero
zero .....
.....
number:
number:
17

18. Контролируемые исключения

public
public class
class CheckedNoCatchDemo
CheckedNoCatchDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws FileNotFoundException
FileNotFoundException {{
Scanner
Scanner consoleIn
consoleIn == new
new Scanner(System.in);
Scanner(System.in);
System.out.println("Enter
System.out.println("Enter file
file name:
name: ");
");
String
String fileName
fileName == consoleIn.nextLine();
consoleIn.nextLine();
Scanner
Scanner fileIn
fileIn == new
new Scanner(new
Scanner(new File(fileName));
File(fileName));
}}
}}
int
int count
count == 0;
0;
while
(fileIn.hasNext())
while (fileIn.hasNext()) {{
String
String word
word == fileIn.next();
fileIn.next();
count++;
count++;
}}
System.out.println("Number
System.out.println("Number of
of words
words is
is "" ++ count);
count);
fileIn.close();
fileIn.close();
Enter
Enter file
file name:
name:
I:\FileIO\hello.txt
I:\FileIO\hello.txt
Exception
Exception in
in thread
thread "main"
"main" java.io.FileNotFoundException:
java.io.FileNotFoundException: I:\FileIO\hello.txt
I:\FileIO\hello.txt (The
(The system
system cannot
cannot find
find the
the
file
file specified)
specified)
at
at java.io.FileInputStream.open(Native
java.io.FileInputStream.open(Native Method)
Method)
at
java.io.FileInputStream.<init>(Unknown
at java.io.FileInputStream.<init>(Unknown Source)
Source)
at
java.util.Scanner.<init>(Unknown
Source)
at java.util.Scanner.<init>(Unknown Source)
at
at usage.CheckedNoCatchDemo.main(CheckedNoCatchDemo.java:16)
usage.CheckedNoCatchDemo.main(CheckedNoCatchDemo.java:16)
18

19. Попытка предотвратить контролируемое исключение

public
public class
class CheckedDemo
CheckedDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) throws
throws FileNotFoundException
FileNotFoundException {{
Scanner
Scanner consoleIn
consoleIn == new
new Scanner(System.in);
Scanner(System.in);
File
File file
file == null;
null;
do
do {{
System.out.println("Enter
System.out.println("Enter file
file name:
name: ");
");
String
String fileName
fileName == consoleIn.nextLine();
consoleIn.nextLine();
file
file == new
new File(fileName);
File(fileName);
}} while
while (!file.exists());
(!file.exists());
try
try {{
Thread.sleep(10000);
Thread.sleep(10000);
}} catch
catch (InterruptedException
(InterruptedException e)
e) {{
e.printStackTrace();
e.printStackTrace();
}}
Scanner
Scanner fileIn
fileIn == new
new Scanner(file);
Scanner(file);
}}
}}
int
int count
count == 0;
0;
while
while (fileIn.hasNext())
(fileIn.hasNext()) {{
String
String word
word == fileIn.next();
fileIn.next();
count++;
count++;
}}
System.out.println("Number
System.out.println("Number of
of words
words is
is "" ++ count);
count);
fileIn.close();
fileIn.close();
19

20. Попытка предотвратить контролируемое исключение

Enter
Enter file
file name:
name:
I:\FileIO\hello.txt
I:\FileIO\hello.txt
Exception
Exception in
in thread
thread "main"
"main" java.io.FileNotFoundException:
java.io.FileNotFoundException: I:\FileIO\hello.txt
I:\FileIO\hello.txt (The
(The system
system cannot
cannot find
find the
the
file
file specified)
specified)
at
at java.io.FileInputStream.open(Native
java.io.FileInputStream.open(Native Method)
Method)
at
at java.io.FileInputStream.<init>(Unknown
java.io.FileInputStream.<init>(Unknown Source)
Source)
at
java.util.Scanner.<init>(Unknown
Source)
at java.util.Scanner.<init>(Unknown Source)
at
at usage.CheckedDemo.main(CheckedDemo.java:27)
usage.CheckedDemo.main(CheckedDemo.java:27)
20

21.

Перехватывание исключений
21

22. Перехватывание исключений

Если исключение не перехватывается программой оно перехватывается стандартным
обработчиком исключений. Стандартный обработчик выводит тип исключения, строку
описывающую исключение и трассировку стека. Для перехватывания и обработки
исключения можно поместить фрагмент кода который может выбросить исключение в
блок try, а код для обработки исключения в блок catch. В операторе catch указывается
тип перехватываемых исключений. Когда выбрасывается исключение выполнение
программы останавливается и выполнение передаётся блоку catch перехватывающему
исключение.
22

23. Перехватывание исключений

try
try {{
statement_sequence
statement_sequence
}} catch
catch (ExceptionType
(ExceptionType11 id
id11)) {{
another_statement_sequence
another_statement_sequence
}}
23

24. Перехватывание контролируемого исключения

public
public class
class CheckedCatchDemo
CheckedCatchDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Scanner
Scanner fileIn
fileIn == null;
null;
do
do {{
Scanner
Scanner consoleIn
consoleIn == new
new Scanner(System.in);
Scanner(System.in);
System.out.println("Enter
System.out.println("Enter aa file
file name:
name: ");
");
String
String fileName
fileName == consoleIn.nextLine();
consoleIn.nextLine();
try
{
try {
fileIn
fileIn == new
new Scanner(new
Scanner(new File(fileName));
File(fileName));
}} catch
catch (FileNotFoundException
(FileNotFoundException e)
e) {{
System.out.println("File
System.out.println("File not
not found");
found");
}}
}} while
while (fileIn
(fileIn ==
== null);
null);
}}
}}
int
int count
count == 0;
0;
while
while (fileIn.hasNext())
(fileIn.hasNext()) {{
String
String word
word == fileIn.next();
fileIn.next();
count++;
count++;
}}
System.out.println("Number
System.out.println("Number of
of words
words is
is "" ++ count);
count);
fileIn.close();
fileIn.close();
Enter
Enter aa file
file name:
name:
hello
hello world!
world!
File
File not
not found
found
Enter
Enter aa file
file name:
name:
I:\FileIO\words.txt
I:\FileIO\words.txt
Number
Number of
of words
words is
is 16
16
24

25.

Множественные операторы catch
25

26. Множественные операторы catch

Если фрагмент кода может выбрасывать более одного исключения можно использовать
несколько операторов catch каждый для перехвата своего типа исключений. Когда
выбрасывается исключение операторы catch проверяются по порядку и первый тип
которого позволяет обработать исключение выполняется. После того как выполнился
один оператор catch остальные операторы пропускаются и выполнение продолжается
после блока try/catch. Оператор catch для класса исключения потомка должен идти до
оператора catch для класса исключения предка в противном случе будет ошибка
компиляции.
26

27. Множественные операторы catch

try
try {{
statement_sequence
statement_sequence
}} catch
catch (ExceptionType
(ExceptionType11 id
id11)) {{
statement_sequence
statement_sequence11
}} catch
catch (ExceptionType
(ExceptionType22 id
id22)) {{
statement_sequence
statement_sequence22
}} catch
catch (ExceptionType
(ExceptionType33 id
id33)) {{
...
...
}} catch
catch (ExceptionType
(ExceptionTypeNN id
idNN)) {{
statement_sequence
statement_sequenceNN
}}
27

28. Множественные операторы catch

public
public class
class CheckedMultipleCatchDemo
CheckedMultipleCatchDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
BufferedReader
BufferedReader console
console == new
new BufferedReader(new
BufferedReader(new InputStreamReader(System.in));
InputStreamReader(System.in));
while
while (true)
(true) {{
try
try {{
System.out.println("Please
System.out.println("Please enter
enter the
the file
file name:
name: ");
");
String
filename
=
console.readLine();
String filename = console.readLine();
FileWriter
FileWriter out
out == new
new FileWriter(new
FileWriter(new File(filename));
File(filename));
out.write("Hello
out.write("Hello World!");
World!");
out.close();
out.close();
}} catch
catch (FileNotFoundException
(FileNotFoundException e)
e) {{
System.out.println("File
System.out.println("File not
not found");
found");
}} catch
catch (EOFException
(EOFException e)
e) {{
System.out.println("End
System.out.println("End of
of file
file reached");
reached");
}}
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("General
System.out.println("General I/O
I/O exception");
exception");
}}
28

29. Множественные операторы catch

Please
Please enter
enter the
the file
file name:
name:
I:\noSuchDir\noSuchfile.txt
I:\noSuchDir\noSuchfile.txt
File
File not
not found
found
Please
Please enter
enter the
the file
file name:
name:
29

30.

Завершение с помощью finally
30

31. Блок finally

Блок finally содержит код который будет обязательно выполнен после
завершения выполнения блоков try/catch независимо от того было
выброшено исключение в блоке try или нет. Как правило он
используется для гарантированного освобождения ресурсов. Блок
finally указывать не обязательно, но у каждого блока try должен быть
по крайней мере один ассоциированный блок catch или блок finally.
В JDK 7 добавлена новая форма оператора try обеспечивающая
автоматическое освобождение ресурсов - try-with-resource. Эта
форма оператора try защищает исключение выброшенное из блока
try от замены исключениями выброшенными при освобождении
ресурсов, но позволяет при необходимости их получить.
31

32. Завершение с помощью finally

try
try {{
statement_sequence
statement_sequence
}} catch
catch (ExceptionType
(ExceptionType11 id
id11)) {{
statement_sequence
statement_sequence11
}} catch
catch (ExceptionType
(ExceptionType22 id
id22)) {{
...
...
}} catch
catch (ExceptionType
(ExceptionTypeNN id
idNN)) {{
statement_sequence
statement_sequenceNN
}} finally
finally {{
statement_sequence
statement_sequence
}}
32

33. Блок finally

public
public class
class SimpleFinallyDemo
SimpleFinallyDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
String
String name
name == "I:\\FileIO\\helloWorld.xml";
"I:\\FileIO\\helloWorld.xml";
BufferedReader
BufferedReader reader
reader == null;
null;
try
try {{
reader
reader == new
new BufferedReader(new
BufferedReader(new FileReader(name));
FileReader(name));
String
line
=
null;
String line = null;
while
while ((line
((line == reader.readLine())
reader.readLine()) !=
!= null)
null) {{
System.out.println(line);
System.out.println(line);
}}
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Problem
System.out.println("Problem occured
occured :: "" ++ e.getMessage());
e.getMessage());
}} finally
finally {{
try
try {{
if
if (reader
(reader !=
!= null)
null) {{
System.out.println("Closing
System.out.println("Closing reader...");
reader...");
reader.close();
reader.close();
}}
}} catch
catch (IOException
(IOException e)
e) {{
System.out.println("Can
System.out.println("Can not
not close
close reader
reader :: "" ++ e.getMessage());
e.getMessage());
}}
}}
}}
33

34. Блок finally

Reader
Reader opened.
opened.
<greeting>
<greeting>
Hello
Hello world!
world!
</greeting>
</greeting>
Closing
Closing reader...
reader...
Problem
Problem occured
occured :: I:\FileIO\hello.xml
I:\FileIO\hello.xml (The
(The system
system cannot
cannot find
find the
the file
file specified)
specified)
34

35. Завершение с помощью finally

try
try {{
statement_sequence
statement_sequence
}} finally
finally {{
statement_sequence
statement_sequence
}}
35

36. Блок finally без catch

public
public class
class NestedFinallyDemo
NestedFinallyDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
String
String name
name == "I:\\FileIO\\hello.xml";
"I:\\FileIO\\hello.xml";
}}
try
try {{
BufferedReader
BufferedReader reader
reader == new
new BufferedReader(new
BufferedReader(new FileReader(name));
FileReader(name));
System.out.println("Reader
System.out.println("Reader opened.");
opened.");
try
try {{
String
String line
line == null;
null;
while
((line
=
while ((line = reader.readLine())
reader.readLine()) !=
!= null)
null) {{
System.out.println(line);
System.out.println(line);
}}
}} finally
finally {{
System.out.println("Closing
System.out.println("Closing reader...");
reader...");
reader.close();
reader.close();
}}
}} catch
catch (IOException
(IOException ex)
ex) {{
System.out.println("Problem
System.out.println("Problem occured
occured :: "" ++ ex.getMessage());
ex.getMessage());
}}
}}
36

37. Блок finally без catch

Reader
Reader opened.
opened.
<greeting>
<greeting>
Hello
Hello world!
world!
</greeting>
</greeting>
Closing
Closing reader...
reader...
Problem
Problem occured
occured :: I:\FileIO\hello.xml
I:\FileIO\hello.xml (The
(The system
system cannot
cannot find
find the
the file
file specified)
specified)
37

38. Блок finally и операторы перехода управления

Блок finally выполняется всегда даже когда блоки try и catch содержат
операторы перехода управления (return, break, continue, throw). Если
блок finally включает оператор перехода управления этот оператор
заменяет передачу управления из блоков try или catch. По этой
причине не следует использовать операторы перехода управления в
блоке finally.
38

39. Блоки finally

class
class FinallyControlDemo
FinallyControlDemo {{
static
static void
void methodA()
methodA() {{
try
try {{
System.out.println("Enter
System.out.println("Enter methodA()");
methodA()");
throw
throw new
new RuntimeException("demo");
RuntimeException("demo");
}} finally
{
finally {
System.out.println("methodA's
System.out.println("methodA's finally");
finally");
}}
}}
static
static void
void methodB()
methodB() {{
try
try {{
System.out.println("Enter
System.out.println("Enter methodB");
methodB");
return;
return;
}} finally
finally {{
System.out.println("methodB's
System.out.println("methodB's finally");
finally");
}}
}}
static
static void
void methodC()
methodC() {{
try
try {{
System.out.println("Enter
System.out.println("Enter methodC");
methodC");
}} finally
finally {{
System.out.println("methodC's
System.out.println("methodC's finally");
finally");
}}
}}
}}
public
public static
static void
void main(String
main(String args[])
args[]) {{
try
try {{
methodA();
methodA();
}} catch
catch (Exception
(Exception e)
e) {{
System.out.println("Exception
System.out.println("Exception from
from methodA
methodA caught");
caught");
}}
methodB();
methodB();
methodC();
methodC();
}}
39

40. Блоки finally

Enter
Enter methodA()
methodA()
methodA's
methodA's finally
finally
Exception
Exception from
from methodA
methodA caught
caught
Enter
Enter methodB
methodB
methodB's
methodB's finally
finally
Enter
methodC
Enter methodC
methodC's
methodC's finally
finally
40

41. Замена исключения

class
class VeryImportantException
VeryImportantException extends
extends Exception
Exception {{
public
public String
String toString()
toString() {{
return
return "A
"A very
very important
important exception!";
exception!";
}}
}}
class
class NotSoImportantException
NotSoImportantException extends
extends Exception
Exception {{
public
public String
String toString()
toString() {{
return
return "Not
"Not so
so important
important exception";
exception";
}}
}}
class
class SomeClass
SomeClass {{
void
void someMethod()
someMethod() throws
throws VeryImportantException
VeryImportantException {{
throw
throw new
new VeryImportantException();
VeryImportantException();
}}
void
void close()
close() throws
throws NotSoImportantException
NotSoImportantException {{
throw
throw new
new NotSoImportantException();
NotSoImportantException();
}}
}}
public
public class
class FinallyReplaceExceptionDemo
FinallyReplaceExceptionDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
try
try {{
SomeClass
SomeClass some
some == new
new SomeClass();
SomeClass();
try
{
try {
some.someMethod();
some.someMethod();
}} finally
finally {{
some.close();
some.close();
}}
}} catch
catch (Exception
(Exception e)
e) {{
System.out.println(e);
System.out.println(e);
}}
}}
}}
Not
Not so
so important
important exception
exception
41

42. Исчезновение исключения

public
public class
class FinallyLostExceptionDemo
FinallyLostExceptionDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
try
try {{
throw
throw new
new RuntimeException();
RuntimeException();
}} finally
finally {{
System.out.println("Return
System.out.println("Return in
in finally
finally block
block will");
will");
System.out.println("make
System.out.println("make any
any exception
exception disappear");
disappear");
}}
}}
}}
return;
return;
Return
Return in
in finally
finally block
block will
will
make
make any
any exception
exception disappear
disappear
42

43. Замена возвращаемого значения

class
class Calculator
Calculator {{
}}
int
int someMethod(int
someMethod(int i)
i) {{
try
try {{
return
return i*1000;
i*1000;
}} finally
{
finally {
return
return 100;
100;
}}
}}
public
public class
class FinallyReplaceReturn
FinallyReplaceReturn {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
}}
}}
Calculator
Calculator calculator
calculator == new
new Calculator();
Calculator();
for
(int
i
=
0;
i
<
10;
i++)
for (int i = 0; i < 10; i++) {{
System.out.println(calculator.someMethod(i));
System.out.println(calculator.someMethod(i));
}}
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
100
43

44.

Конструкторы и блоки инициализации
44

45. Конструкторы и блоки инициализации

Конструкторы
могут
выбрасывать
контролируемые
и
неконтролируемые исключения. Если при вызове конструктора
выбрасывается исключение, объект будет создан, но ссылка на него
оператором new возвращена не будет. Блоки инициализации могут
выбрасывать и контролируемые и неконтролируемые исключения.
Контролируемые исключения в этом случае необходимо объявлять в
каждом конструкторе. Статические блоки инициализации могут
выбрасывать только неконтролируемые исключения. Если из
статического блока инициализациии выбрасывается исключение
класс не загружается, а исключение перебрасывается обёрнутое в
ExceptionInInitializerError.
45

46. Исключение в конструкторе

class
class Person
Person {{
private
private final
final String
String name;
name;
private
private final
final int
int age;
age;
private
private static
static final
final int
int MAXIMUM_AGE
MAXIMUM_AGE == 150;
150;
public
public Person(String
Person(String name,
name, int
int age)
age) {{
this.name
this.name == name;
name;
this.age
=
age;
this.age = age;
if
if (this.age
(this.age << 00 ||
|| this.age
this.age >> MAXIMUM_AGE)
MAXIMUM_AGE) {{
throw
throw new
new IllegalArgumentException("age
IllegalArgumentException("age out
out of
of range:
range: "" ++ this.age
this.age
++ "" expected
expected range
range 00 <=
<= age
age << "" ++ MAXIMUM_AGE);
MAXIMUM_AGE);
}}
if
if (this.name
(this.name ==
== null)
null) {{
throw
throw new
new IllegalArgumentException("name
IllegalArgumentException("name is
is null");
null");
}}
}}
public
public String
String toString()
toString() {{
return
return "Person
"Person [name="
[name=" ++ name
name ++ ",
", age="
age=" ++ age
age ++ "]";
"]";
}}
}}
46

47. Исключение в конструкторе

public
public class
class ConstructorExceptionDemo
ConstructorExceptionDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
Person
Person harry
harry == new
new Person("Harry
Person("Harry Hacker",
Hacker", 25);
25);
System.out.println(harry);
System.out.println(harry);
Person
Person tonny
tonny == new
new Person("Tonny
Person("Tonny Tester",
Tester", -25);
-25);
System.out.println(tonny);
System.out.println(tonny);
}}
}}
Person
Person [name=Harry
[name=Harry Hacker,
Hacker, age=25]
age=25]
Exception
Exception in
in thread
thread "main"
"main" java.lang.IllegalArgumentException:
java.lang.IllegalArgumentException: age
age out
out of
of range:
range: -25
-25 expected
expected 00 <=
<= age
age << 150
150
at
at usage.Person.<init>(ConstructorExceptionDemo.java:27)
usage.Person.<init>(ConstructorExceptionDemo.java:27)
at
at usage.ConstructorExceptionDemo.main(ConstructorExceptionDemo.java:10)
usage.ConstructorExceptionDemo.main(ConstructorExceptionDemo.java:10)
47

48. Исключение в статическом блоке инициализации

class
class LogManager
LogManager {{
private
private static
static final
final String
String FILENAME
FILENAME == "config.txt";
"config.txt";
private
private static
static LogManager
LogManager manager;
manager;
static
static {{
try
try {{
InputStream
InputStream is
is == new
new FileInputStream(FILENAME);
FileInputStream(FILENAME);
System.out.println("Reading
System.out.println("Reading configuration
configuration file");
file");
is.close();
is.close();
}} catch
catch (IOException
(IOException ex)
ex) {{
IllegalStateException
IllegalStateException ise
ise == new
new IllegalStateException(
IllegalStateException(
"Error
loading
configuration
"Error loading configuration file
file "" ++ FILENAME);
FILENAME);
ise.initCause(ex);
ise.initCause(ex);
throw
throw ise;
ise;
}}
}}
private
private LogManager()
LogManager() {{
}}
public
public static
static LogManager
LogManager getLogManager()
getLogManager() {{
if
if (manager
(manager ==
== null)
null)
manager
manager == new
new LogManager();
LogManager();
return
return manager;
manager;
}}
}}
48

49. Исключение в статическом блоке инициализации

public
public class
class StaticInitializerExceptionDemo
StaticInitializerExceptionDemo {{
public
public static
static void
void main(String[]
main(String[] args)
args) {{
LogManager
LogManager manager
manager == LogManager.getLogManager();
LogManager.getLogManager();
}}
}}
Exception
Exception in
in thread
thread "main"
"main" java.lang.ExceptionInInitializerError
java.lang.ExceptionInInitializerError
at
at usage.StaticInitializerExceptionDemo.main(StaticInitializerExceptionDemo.java:10)
usage.StaticInitializerExceptionDemo.main(StaticInitializerExceptionDemo.java:10)
Caused
Caused by:
by: java.lang.IllegalStateException:
java.lang.IllegalStateException: Error
Error loading
loading configuration
configuration file
file config.txt
config.txt
at
usage.LogManager.<clinit>(StaticInitializerExceptionDemo.java:26)
at usage.LogManager.<clinit>(StaticInitializerExceptionDemo.java:26)
...
... 11 more
more
Caused
Caused by:
by: java.io.FileNotFoundException:
java.io.FileNotFoundException: config.txt
config.txt (The
(The system
system cannot
cannot find
find the
the file
file specified)
specified)
at
at java.io.FileInputStream.open(Native
java.io.FileInputStream.open(Native Method)
Method)
at
at java.io.FileInputStream.<init>(FileInputStream.java:120)
java.io.FileInputStream.<init>(FileInputStream.java:120)
at
java.io.FileInputStream.<init>(FileInputStream.java:79)
at java.io.FileInputStream.<init>(FileInputStream.java:79)
at
at usage.LogManager.<clinit>(StaticInitializerExceptionDemo.java:22)
usage.LogManager.<clinit>(StaticInitializerExceptionDemo.java:22)
...
... 11 more
more
49
English     Русский Правила