Основные особенности языка Java - краткий обзор Ведущий семинара: Максим Лейкин, компания «МЕРА НН»

Презентация:



Advertisements
Похожие презентации
1 Java 6. ИНТЕРФЕЙСЫ И ВНУТРЕННИЕ КЛАССЫ. 2 Интерфейсы Не являются классами Ни один из объявленных методов не может быть реализован внутри интерфейса.
Advertisements

1 Java 6. ИНТЕРФЕЙСЫ И ВНУТРЕННИЕ КЛАССЫ. 2 Интерфейсы Не являются классами Ни один из объявленных методов не может быть реализован внутри интерфейса.
1 Обработка исключений в Java Одно из важнейших преимуществ Java – разработанный на уровне языка механизм обработки исключений. Исключение в Java - это.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Saint Petersburg, 2011 Java Lecture #06 Exceptions.
Обработка исключительных ситуаций Исключительная ситуация (исключение) – это ошибка, возникающая во время выполнения программы. Например, ошибка работы.
Перегрузка операторов x = a + b результат 1-й операнд2-й операнд оператор По количеству операндов операторы делятся на: унарные (один операнд) бинарные.
Лекция 2 Раздел 2.1 Windows Phone Темы раздела 3.
1 Классы в Java Ключевое слово class означает: Я говорю тебе, как выглядит новый тип объекта. Класс является базовым элементом объектно-ориентированного.
1 © Luxoft Training 2012 Java: расширенные вопросы Модуль #8.
Кафедра ОСУ, Java 2004 Слайд 1 Наследование Наследование позволяет использовать существующий класс для определения новых классов, т.е. способствует.
Фрагмент карты градостроительного зонирования территории города Новосибирска Масштаб 1 : 4500 к решению Совета депутатов города Новосибирска от
Исключения в Java. Исключения – это механизм взаимодействия между кодом, приведшим к ошибке, и кодом, обрабатывающим ошибку Исключение выбрасывается (throw),
Таблица умножения на 8. Разработан: Бычкуновой О.В. г.Красноярск год.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
Работа учащегося 7Б класса Толгского Андрея. Каждое натуральное число, больше единицы, делится, по крайней мере, на два числа: на 1 и на само себя. Если.
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Проектирование архитектуры ИСО 1. UML 2 Структура определения языка 4.
Лекция 8 Область видимости Время жизни. Область видимости Область видимости – характеристика именованного объекта Область видимости - часть текста программы,
Матемтааки ЕТ СТ 2 класс Шипилова Наталия Викторовна учитель начальных классов, ВКК Шипилова Наталия Викторовна учитель начальных классов, ВКК.
Транксрипт:

Основные особенности языка Java - краткий обзор Ведущий семинара: Максим Лейкин, компания «МЕРА НН»

2 История создания и эволюция языка Java James GoslingScott McNealyPatrick Naughton Sun Microsystems ( – ныне часть компании Oracle ( Январь, 1991 г. Начало разработки нового языка программирования. Главная причина недовольства С++: Необходимо перекомпилировать, а зачастую и переписывать код под каждую новую архитектуру микропроцеесора, операционную систему и т.п.

3 История создания и эволюция языка Java Сентябрь, 1992 г. Oak (дуб) 23 марта 1995 г. Официальное объявление языка Java 1999 г. - Java 2 SE – Java 2 Standard Edition

4 Ключевые особенности языка Java архитектурная независимость и переносимость кода полная объектная ориентированность устойчивость (надежность) кода встроенный механизм поддержки многопоточности безопасность Java-программ встроенная структура коллекций удобство разработки GUI

5 Архитектурная независимость и переносимость кода C++ Java "Write Once, Run Anywhere"

6 Архитектурная независимость и переносимость кода Java Байт-код – архитектурно нейтральный, высокооптимизированный набор команд, предназначенных для выполнения специальной исполняющей системой. JVM (Java Virtual Machine, виртуальная Java-машина) – исполняющая система, интерпретирующая байт-код

7 Архитектурная независимость и переносимость кода

8 Полная объектная ориентированность Основная структурная единица программы – класс, весь код Java-программы должен находиться внутри одного или нескольких классов.

9 отсутствие адресной арифметики технология «сборки мусора» (garbage collection) строгая типизация отсутствие множественного наследования классов запрет перегрузки операторов встроенная обработка исключений Устойчивость (надежность) кода «Java is C++ without the Guns and Knives» (С) J.Gosling

10 Многопоточность Java предоставляет средства создания приложений с множеством одновременно активных потоков. Для эффективной работы с потоками в Java реализован механизм семафоров и средств синхронизации потоков: библиотека языка предоставляет класс Thread, а система выполнения предоставляет средства диспетчеризации и средства, реализующие семафоры. Поддержка многопоточности

11 Безопасность JVM - аналог виртуального компьютера, расположенного в оперативной памяти и интерпретирующего байт- код. Все действия Java- программы замкнуты внутри этого виртуального компьютера. JVM может не допускать деструктивных действий Java-программ.

12 Встроенная структура коллекций Структура коллекций ИнтерфейсыРеализацииАлгоритмы Структура коллекций (collections framework) Java стандартизирует способ, с помощью которого программы хранят и обрабатывают структуры данных.

13 Встроенная структура коллекций Преимущества использования структуры коллекций: 1.Избавление от рутинных операций по кодированию стандартных структур данных и алгоритмов 2. Высокая эффективность реализации 3. Универсальность и простота изучения (различные типы коллекций работают похожим друг на друга образом и с высокой степенью способности к взаимодействию) 4. Расширяемость 5. Параметризация

14 Удобство разработки GUI В состав Java входят 2 библиотеки, предназначенных для разработки GUI: - AWT (Abstract Window Toolkit) – платформно-зависимая библиотека, вывод осуществляется через вызовы OS API - Swing - платформно-незаивисимая библиотека, реализованная полностью на Java, через OS API выводится только окно, все остальное рисуется средствами Java

15 Инструментальные средства 1.Java Software Development Kit - Oracle Текущая версия Java (TM) SE Development Kit 7 ads/index.html 2. RAD – средства разработки: –Eclipse Project (open source project) –NetBeans (open source project) –IntelliJ IDEA (JetBrains) –JCreator Pro (Xinox Software) –Symantec Cafe (Symantec) –Visual J++ (Microsoft) –Together (TogetherSoft Corporation) Большая часть инструментария для разработки Java-программ распространяется бесплатно!

16 Первая программа на Java class FirstProg {public static void main(String args[ ]) { System.out.println (Hello, world); } > FirstProg.class

17 Литература и источники информации в сети Интернет 1.Ноутон П., Шилдт Г. Java 2 в подлиннике. – СПб, «BHV», Г.Шилдт. Полный справочник по Java. – М.: Вильямс, Б. Эккель. Thinking in Java. – Спб.:Питер, Joshua Bloch. Effective Java: Second Edition. – Prentice Hall, М.Гранд. Шаблоны проектирования в JAVA. Каталог популярных шаблонов проектирования, проиллюстрированных при помощи UML. – М.: Новое знание,

18 Классы и методы Описание класса class {[модификатор] ; … [модификатор] ; [модификатор] (

19 Классы и методы Описание класса class Point {int x, y; Point () {x=0; y=0; } Point (int x1,int y1) {x=x1; y=y1; } int getX() {return x;} int getY() {return y;} } Экземплярные переменные (instance variables) Методы класса (methods) Конструкторы (перегруженные) Члены класса (class members)

20 Классы и методы Создание ссылочных переменных и объектов класса Point p1; создана ссылочная переменная p1 = new Point(); создан объект Point p3 = p1; создана ссылочная переменная указывающая на p1 Point p2 = new Point(); «короткая форма» создания объекта p1 p3 объект cсылка на p1

21 Классы и методы Создание ссылочных переменных и объектов класса Point p1; { p1 = new Point(5,10); p1 = null; } System.out.println(p1.x + "" + p1.y); NullPointerException {Point p1 = new Point(5,10); } System.out.println(p1.x + "" + p1.y); Cannot find variable p1 Point p2; {Point p1 = new Point(5,10); p2 = p1; p1 = null; } System.out.println(p2.x +, + p2.y); 5, 10

22 Классы и методы Перегрузка (overloading) методов [модификатор] (

23 Классы и методы class OverloadDemo {void test() {System.out.println(Параметры отсутствуют); } void test(int a, int b) {System.out.println(a и b: + a + + b); } void test(double a) {System.out.println(Вещественное a: + a); } Перегрузка (overloading) методов

24 Классы и методы Модификатор static Статические переменные Объявление: static Статические переменные: создаются в единственном экземпляре существуют вне зависимости от объектов класса создаются JVM в момент первого обращения к классу допускают обращение до создания объектов класса Обращение:.

25 Классы и методы Модификатор static Статические методы Обращение:. () Статические методы: могут вызывать только другие статические методы данного класса должны обращаться только к статическим переменным внутри статических методов нельзя использовать ссылки this и super Объявление: static ( )

26 Классы и методы Модификатор static Статические блоки кода Объявление: static { … } Статический блок кода выполняется один раз при первоначальной загрузке класса

27 Классы и методы Использование ключевого слова this 1. Чтобы обойти скрытие переменной экземпляра формальными параметрами Class Point { int x, y; Point (int x, int y) {this.x=x; this.y=y; }

28 Классы и методы Использование ключевого слова this 2. Чтобы вызвать один конструктор из другого конструктора (explicit constructor invocation) public class Rectangle {private int x, y, w, h; public Rectangle() {this.x = 0; this.y = 0; this.w = 0; this.h = 0;} public Rectangle(int w, int h) {this.x = 0; this.y = 0; this.w = w; this.h = h;} public Rectangle(int x, int y, int w, int h) {this.x = x; this.y = y; this.w = w; this.h = h; } }

29 Классы и методы Использование ключевого слова this 2. Чтобы вызвать один конструктор из другого конструктора (explicit constructor invocation) public class Rectangle {private int x, y, w, h; public Rectangle() {this(0, 0, 0, 0);} public Rectangle(int w, int h) {this(0, 0, w, h);} public Rectangle(int x, int y, int w, int h) {this.x = x; this.y = y; this.w = w; this.h = h; } }

30 Классы и методы Вложенные классы Статические вложенные классы (static nested classes) Нестатические вложенные классы (inner classes - внутренние классы) Причины создания вложенных классов: 1.Логическая группировка классов 2.Расширяет возможности инкапсуляции 3.В некоторых случаях повышает читабельность кода

31 Классы и методы Статические вложенные классы Статический вложенный класс является статическим членом класса, в который он вложен. Т.е. он не может напрямую работать с нестатическими переменными и методами внешнего класса.

32 Классы и методы Статические вложенные классы class A { static int x; int y; A() { System.out.println("constructor A"); } static class B {B() { System.out.println("constrcutor B"); x = 5; A a = new A(); a.y = 15; } public class Test { public static void main(String[ ] args) { A.B b = new A.B(); }

33 Классы и методы Нестатические вложенные классы Нестатический вложенный класс является обычным членом внешнего класса, т.е. существует только в составе объекта внешнего класса и имеет прямой доступ к переменным и методам внешнего класса. Объект вложенного класса может существовать только внутри объекта внешнего класса Существуют (и довольно часто используются) также анонимные внутренние классы (рассмотрим в обработке событий)

34 Классы и методы Нестатические вложенные классы class A { static int x; int y; A() { System.out.println("constructor A"); } class B { B() { System.out.println("constrcutor B"); x = 5; y = 15; } public class Test { public static void main(String[ ] args) {A a = new A(); A.B b = a.new B(); }

35 Классы и методы Наследование Общая форма объявления класса, наследующего суперкласс: class extends { //тело класса } Язык Java не поддерживает множественного наследования классов!!!

36 Классы и методы Наследование class Point3D extends Point {int z; Point3D () { z=0; } Point3D (int x1, int y1, int z1) { z=z1; } }

37 Классы и методы Порядок вызова конструкторов при наследовании При создании объекта подкласса всегда вызывается конструктор его базового класса, у того конструктор его базового класса и т.д. вплоть до корня иерархии (класса Object). Причем если не указано явно (с помощью super) вызывается конструктор без параметров (созданный явно или по умолчанию). Если подходящего конструктора нет – выдается ошибка компиляции.

38 Классы и методы Ключевое слово super super (parameters) – вызов должен быть первым в конструкторе подкласса Внимание! Это применяется только если надо вызвать конструктор суперкласса с параметрами! 1.Вызов конструктора непосредственного суперкласса super.var_name или super.metod_name() (super не влияет на тип доступа) 2. Доступ к элементу суперкласса, скрытому элементом подкласса

39 Классы и методы Порядок вызова конструкторов при наследовании без использования super class Point3D extends Point {int z; Point3D () { z=0; } Point3D (int x1,int y1, int z1) { z=z1; } } Point3D p3d = new Point3D(); Point() -> Point3D() Point3D p3d = new Point3D(10, 20, 30); Point() -> Point3D(10,20,30)

40 Классы и методы Порядок вызова конструкторов при наследовании с использованием super class Point3D extends Point {int z; Point3D () { z=0; } Point3D (int x1,int y1, int z1) { super (x1, y1); z=z1; } } Point3D p3d = new Point3D(); Point() -> Point3D() Point3D p3d = new Point3D(10, 20, 30); Point(10, 20) -> Point3D(10,20,30)

41 Классы и методы Модификаторы доступа class Parent {public int v1; private int v2; protected int v3; int v4; } class Child extends Parent { // доступны v1, v3, v4 // недоступна v2 } class Other { // доступны v1, v3, v4 // недоступна v2 }

42 Классы и методы Модификаторы доступа В правильно спроектированном Java- классе, все экземплярные переменные класса должны иметь модификатор private, доступ должен осуществляться через set/get методы («сеттеры/геттеры») В Eclipse: Source -> generate Getters and Setters

43 Классы и методы Модификаторы доступа class Point {int x, y; Point () {x=0; y=0; } Point (int x1,int y1) {x=x1; y=y1; } } class Point {private int x, y; Point () {x=0; y=0; } Point (int x1,int y1) {x=x1; y=y1; } public int getX() {return x;} public int getY() {return y;} public int setX(int x) { this.x = x;} public int setY(int y) { this.y = y;} }

44 Классы и методы Динамическая диспетчеризация ссылок Ссылочной переменной суперкласса может быть назначена ссылка на любой подкласс, производный от этого суперкласса. Если ссылочная переменная суперкласса указывает на объект подкласса, через эту переменную можно получить доступ только к тем членам подкласса, которые определяются в суперклассе.

45 Классы и методы Динамическая диспетчеризация ссылок class Point { int x, int y; } class Point3D extends Point { int z; } … Point Pobj = new Point(); Point3D Cobj = new Point3D(); Pobj = Cobj; Pobj.x = 1; //верно! x определена в Point Pobj.z = 10; //ошибка! z не определена в Point …

46 Классы и методы Динамическая диспетчеризация методов Переопределение метода (overriding) – создание в подклассе метода, совпадающего по сигнатуре с методом суперкласса. Динамическая диспетчеризация методов – это механизм, позволяющий определить какой из переопределенных методов нужно вызвать, во время выполнения, а не во время компиляции.

47 Классы и методы Динамическая диспетчеризация методов class Figure {double dim1, dim2; Figure(double a, double b) {dim1 = a; dim2 = b; } void square() {System.out.println (Square is not defined); } } class Rectangle extends Figure {Rectangle(double a, double b) {super(a,b);} void square() {System.out.println(Rectangle square = + (dim1*dim2)); } }

48 Классы и методы Динамическая диспетчеризация методов class Triangle extends Figure {Triangle(double a, double b) {super(a,b);} void square() {System.out.println(Trian gle square= + (dim1*dim2/2)); } } class FindSquare {public static void main(String args[ ]) {Figure f; Random r = new Random(); for (int k=0; k

49 Классы и методы Динамическая диспетчеризация методов Вывод этой программы:Rectangle square = 45.0 Triangle square= 40.0 Rectangle square = 45.0 Triangle square= 40.0 Rectangle square = 45.0 Triangle square= 40.0 Rectangle square = 45.0

50 Классы и методы Абстрактные методы и классы Объявление абстрактного метода: abstract ( ); Если в классе есть хотя бы один абстрактный метод -> класс должен быть объявлен абстрактным. abstract class { … } Любой подкласс абстрактного класса должен или реализовать все его абстрактные методы или сам должен быть объявлен абстрактным !

51 Классы и методы Абстрактные методы и классы abstract class Figure {double dim1, dim2; Figure(double a, double b) {dim1 = a; dim2 = b; } abstract void square(); }

52 Интерфейсы [ ] interface [extends ] { ( );... = ; } 1.Интерфейсы допускают множественное наследование 2.Все методы – абстрактные (без модификатора abstract) 3.Все переменные – static и final (без соотв. модификаторов), необходима инициализация 4.Все переменные и методы – public (без модификатора)

53 Интерфейсы Реализация интерфейсов class [extends ] [implements ] { …} interface Callback {void callback(int param); } class Client implements Callback {public void callback(int p) {System.out.println("callback called with " + p); } }

54 Интерфейсы Реализация интерфейсов Особенности реализации интерфейсов: 1.Методы, которые реализуют интерфейс, должны быть объявлены как public. Сигнатура типа реализующего метода должна точно соответствовать сигнатуре типа, указанной в определении интерфейса. 2.Если класс включает интерфейс, но реализует не все его методы, то такой класс должен быть объявлен как абстрактный. 3.Если класс реализует интерфейс, унаследованный от другого интерфейса, класс должен реализовать все методы, определенные в цепочке наследования интерфейсов.

55 Интерфейсы Ссылочные переменные интерфейсного типа interface Callback {void callback(int param); } class Client implements Callback { public void callback(int p) //реализация метода интерфейса {System.out.println("callback called with " + p);} int getSquare(int p) //собственный метод класса {System.out.println("square = " + (p*p));} }

56 Интерфейсы class TestIface {public static void main(String args[ ]) {Callback с = new Client(); c.callback(42); //верно! c.getSquare(42); //ошибка! ссылочная переменная интерфейсного типа не может обращаться к собственным методам классов } Ссылочные переменные интерфейсного типа

57 Интерфейсы Взаимоотношения классов и интерфейсов C2 C1 C3 C5 C4 C7C6 I2 I1 I3 I5 I4 I7I6 I8 Классы Интерфейсы extends implements

58 Классы и методы Модификатор final 1. final double pi = 3.14; //неизменяемая локальная переменная 2. final int getX() {…} //метод, для которого запрещено переопределение (overriding) 3. final class A {…} //класс, для которого запрещено наследование

59 Классы и методы final-члены классов, неизменяемые объекты class A { final String mName; public A(String name) { mName = name; } public getName() { return mName; } public setK(String name) { mName = name; } Преимущества неизменяемых объектов: 1)Потокобезопасность ! 2)Производительность !

60 Перечисления в Java: enum enum Season { WINTER, SPRING, SUMMER, AUTUMN } Season season = Season.SPRING; if (season == Season.SPRING) { season = Season.SUMMER; } System.out.println(season); Классы и методы

61 Перечисление – это класс Объявляя enum мы неявно создаем класс производный от java.lang.Enum. Конструкция enum Season {... } эквивалентна class Season extends java.lang.Enum {... }. Явным образом наследоваться от java.lang.Enum не позволяет компилятор, но: System.out.println(Season.class.getSuperclass()); дает вывод: class java.lang.Enum Классы и методы

62 Перечисление – это класс Собственно наследование за нас автоматически выполняет компилятор Java. Условимся называть класс, созданный компилятором для реализации перечисления – enum-классом, а возможные значения перечисляемого типа – элементами enum-a. Элементы перечисления - экземпляры enum- класса, доступные статически. Классы и методы

63 Название и порядковый номер элемента enum Любой enum-класс наследует java.lang.Enum, который содержит ряд методов полезных для всех перечислений. Пример: Season season = Season.WINTER; System.out.println("season.name()=" + season.name() + " season.toString()=" + season.toString() + " season.ordinal()=" + season.ordinal()); Вывод: season.name()=WINTER season.toString()=WINTER season.ordinal()=0 Классы и методы

64 Получение элемента по строковому имени Задача: получить элемент enum по его строковому представлению. Решение: В каждом enum-классе компилятор автоматически создает специальный статический метод: public static EnumClass valueOf(String name), который возвращает элемент перечисления EnumClass с названием, равным name. Пример использования: String name = "WINTER"; Season season = Season.valueOf(name); Результат: переменная season будет равна Season.WINTER. Если элемент не будет найден, то будет выброшен IllegalArgumentException, а если name равен null - NullPointerException. Классы и методы

65 Получение всех элементов перечисления Иногда необходимо получить список всех элементов enum- класса во время выполнения. Для этих целей в каждом enum- классе компилятор создает метод: public static EnumClass[ ] values() Пример использования: System.out.println(Arrays.toString(Season.values())); Вывод: [WINTER, SPRING, SUMMER, AUTUMN] Обратите внимание, что ни метод valueOf(), ни метод values() не определен в классе java.lang.Enum. Вместо этого они автоматически добавляются компилятором на этапе компиляции enum-класса. Классы и методы

66 Методы с переменным числом аргументов в Java Возможность была добавлена в JDK 1.5. Для указания аргумента переменной длины используют три точки (...). Например: static void vaTest(int... v) { … } Эта синтаксическая конструкция указывает компилятору, что метод vaTest () может вызываться с нулем или более аргументов. В результате v неявно объявляется как массив типа int [ ]. Таким образом, внутри метода vaTest () доступ к v осуществляется с использованием синтаксиса обычного массива. Классы и методы

67 Методы с переменным числом аргументов в Java class VarArgs { static void vaTest(int... v) { System.out.println("Кол-во аргументов: " + v.length); for (int i=0;i

68 Методы с переменным числом аргументов в Java Вывод: Количество аргументов: 1 10 Количество аргументов: Количество аргументов: 0 Классы и методы

69 Методы с переменным числом аргументов в Java Вместе с параметром переменной длины массив может содержать обычные параметры. Однако параметр переменной длины должен быть последним параметром, объявленным методом. Например: int dolt(int a, int b, double с, int... vals) //верно! int dolt (int a, int b, double с, int... vals, boolean stopFlag) // ошибка! Метод должен содержать только одни параметр типа varargs. int dolt (int a, int b, double с, int... vals, double... morevals) // ошибка! Классы и методы

70 Пакеты Java обеспечивает специальный механизм для разделения пространства имен классов на именованные области. Этот механизм называется «пакеты» (packages). Пакет – это контейнер для классов, в пределах которого должна сохраняться уникальность имен классов. Общая форма определения пакета: package ; Понятие пакета

71 Пакеты Чтобы хранить пакеты, Java использует каталоги файловой системы. Class- файлы для всех классов, принадлежащих к одному пакету, должны быть сохранены в каталоге, название которого совпадает с именем пакета (регистр важен). package pkg1[.pkg2[.pkg3]];Иерархия пакетов: package java.awt.image;java\awt\image Размещением корня любой иерархии пакетов в файловой системе управляет специальная переменная окружения CLASSPATH. Иерархия пакетов

72 Пакеты Импорт пакетов Импорт класса или пакета: import pkg1[.pkg2].(classname|*); Полное имя класса включает всю иерархию пакетов. 1. Импортирование класса никак не влияет на уровень доступа к его элементам !!! 2. В любую Java-программу автоматически импортируется пакет java.lang.* !!!

73 Пакеты Уровни доступа с учетом пакетов package p1;package p2; public class A {public class D extends A { public int pub; } protected prot;public class E { int def;} private int priv; } public class B extends A { } public class C { }

74 Пакеты Уровни доступа с учетом пакетов ABCDE public+++++ protected private+----

75 Пакеты Уровни доступа с учетом пакетов 1. Доступ на уровне класса: -public - класс виден везде - - класс виден в пределах своего пакета 2. Доступ на уровне членов класса: Модифи- катор Внутри класса В том же пакете Подкласс в другом пакете Произвольный класс в другом пакете public++++ protected private+---

76 Структура Java-программы -В первой строке файла может быть 1 необязательный оператор package -В следующих строках может быть 1 или несколько необязательных операторов import -Далее идут описания классов и интерфейсов Среди классов, описанных в одном файле, только один может быть объявлен с модификатором public.

77 Обработка исключений Типы ошибок Ошибки компиляцииВремени выполнения (run-time errors, exceptions, исключения) if (flag == 1) n=0; else n=1; val=1/n; Логические ошибки

78 Обработка исключений Исключение в Java это объект некоторого класса, который описывает исключительное состояние, возникшее в каком-либо участке программного кода. При возникновении исключения исполняющая система Java создает объект класса, связанного с данным исключением. Этот объект хранит информацию о возникшей исключительной ситуации (точка возникновения, описание и т.п.) Возможна как автоматическая так и программная генерация исключений.

79 Обработка исключений try { // блок кода } catch (ExceptionType1 еxOb1) { // обработчик исключений типа ExceptionType1 } [catch (ExceptionType2 еxOb2) { // обработчик исключений типа ExceptionType2 }] [finally { //код, который выполняется перед выходом из блока try }] Формат try-catch блока

80 Обработка исключений Формат try-catch блока try { read_from_file ("data.txt"); calculate(); } catch ( FileNotFoundException fe ) { System.out.println("Файл data.txt не найден"); } catch ( ArithmeticException aex ) { System.out.println("Деление на ноль"); }

81 Обработка исключений Формат try-catch блока управление никогда не возвращается из блока catch обратно в блок try, после выполнения catch-блока управление передается строке, следующей сразу после try-catch-блока; область видимости catch-блока ограничена ближайшим предшествующим утверждением try, т.е. catch-блок не может захватывать исключение, выброшенное «не своим» try-блоком; операторы, контролируемые утверждением try, должны быть окружены фигурными скобками даже если это одиночная инструкция. блоки try могут быть вложенными

82 Обработка исключений Стек вызовов Если обработчик не найден исключение передается JVM.

83 Обработка исключений Дефолтный обработчик исключений

84 Обработка исключений Классы исключений никогда не обрабатываются, т.к. не имеет смысла обязательно обрабатывать, иначе код не скомпилируется надо обрабатывать, но компилятор это не проверяет

85 Обработка исключений Классы исключений Catch-блоки просматриваются в порядке их появления в программе, при этом обработчик catch для суперкласса перехватывает исключения как для своего класса так и для всех его подклассов. Следовательно, в последовательности catch-блоков подклассы исключений должны следовать перед любым из суперклассов.

86 Обработка исключений Классы исключений try {inputFile("data.txt"); calculate(); } catch ( IOException ExObj2) {System.out.println("Ошибка ввода-вывода"); } catch ( FileNotFoundException ExObj1) {System.out.println("Файл data.txt не найден"); } Error: unreachable code! т.к. FileNotFoundException – подкласс IOException catch ( FileNotFoundException ExObj1) {System.out.println("Файл data.txt не найден"); } catch ( IOException ExObj2) {System.out.println("Ошибка ввода-вывода"); }

87 Обработка исключений Оператор throw Программная генерация исключения: throw new (); throw new (…);

88 Обработка исключений Оператор throw public void demoproc () {try {throw new NullPointerException("demo"); } catch (NullPointerException e) {System.out.println("caught inside demoproc"); throw e; } } public static void main(String args[]) {try {demoproc(); } catch(NullPointerException e) {System.out.println("recaught: " + e); } }

89 Обработка исключений Оператор throw Вывод программы:

90 Обработка исключений Оператор throws Исключения, которые порождены от Exception, но не от RuntimeException, могут быть сгенерированы только явно операцией throw. При этом если метод может выбрасывать одно из таких исключений, то должно выполняться одно из двух условий: либо для такого исключения должен быть catch-обработчик, либо в заголовке такого метода должна стоять конструкция: throws (т.н. Catch or Specify Requirement) public String readLine() throws IOException

91 Обработка исключений Оператор throws Вызов метода, в описании которого стоит " throws... ", тоже должен находиться либо внутри try-catch-блока, либо внутри метода с конструкцией " throws... " в его заголовке и т.д. вплоть до метода main(). Таким образом, где-то в программе любое возможное исключение, попадающее в категорию Catch or Specify Requirement обязано быть перехвачено и обработано.

92 Обработка исключений Подклассы Exception class MyException extends Exception {private int detail; MyException(int a) {detail = a; } public String toString() {return "MyException[" + detail + "]"; } } Если надо создать исключение необязательное к перехвату – его надо унаследовать от RuntimeException.