- •Java - объектно-ориентированный язык
- •Виртуальная Java-машина.
- •Алфавит языка Java
- •Типы данных
- •Числа высокой точности
- •Переменные в Java
- •Объявление переменной
- •Область действия и время жизни переменной
- •Операции в Java
- •Арифметические операции
- •Логические операции
- •Побитовые операции
- •Операции сдвига
- •Тернарный оператор ?:
- •Оператор запятая
- •Одномерные массивы
- •Многомерные массивы
- •Функции
- •Класс Поля и методы
- •Модификаторы доступа
- •Инициализация и очистка
- •Перегрузка методов
- •Ключевое слово this
- •Вызов конструктора из конструктора
- •Использование объектов в качестве параметров
- •Ключевое слово static
- •Спецификатор final
- •Вложенные и внутренние классы
- •Сборщик «мусора»
- •Как работает сборщик мусора
- •Наследование
- •Основы наследования
- •Использование ключевого слова super
- •Использование super для вызова конструктора суперкласса
- •Использование super для доступа к скрытым членам суперкласса
- •Конструкторы при наследовании
- •Динамическая диспетчеризация методов
- •Абстрактные классы
- •Использование final с наследованием
- •Использование final для отказа от переопределения
- •Использование final для отмены наследования
- •Класс Object
- •Пакеты и интерфейсы Пакеты
- •Оператор package
- •Оператор import
- •Уровни доступа.
- •Интерфейсы
- •Оператор implements
- •Частичные реализации
- •“Множественное” наследование в Java
- •Конфликты имен при комбинировании интерфейсов
- •Расширение интерфейса
- •Группировка констант
- •Инициализирование полей в интерфейсах
- •Вложенные интерфейсы
- •Стандартный ввод/вывод
- •Чтение из стандартного ввода
- •Замена System.Out на PrintWriter
- •Первое приложение Java
- •Исключительные ситуации. Обработка исключений
- •Типы исключений
Типы исключений
Реализующая иерархия классов исключений представляется:
Два непосредственных наследника класса Throwable делят иерархию подклассов исключений на две ветви. Суперкласс первой ветви – класс Ехception. Он используется для описания исключительных ситуации, которые должны перехватываться программным кодом пользователя. Другая ветвь (класс Error) предназначена для описания исключительных ситуаций, которые при обычных условиях не должны перехватываться в пользовательской программе.
Пример неперехваченного исключения можно продемонстрировать на примере деления на ноль. Объекты-исключения автоматически создаются исполняющей средой Java в результате возникновения данного исключительного состояния.
Типом исключения не Exception и не Throwable. Это подкласс ArithmeticException класса Exception, поясняющий, какая ошибка возникла при выполнении программы. В следующей программе возникает та же исключительная ситуация, но не в main а функции другого класса.
В результате работы этой программы обработчик исключений исполняющей системы Java выводит содержимое всего стека вызовов.
Все такие исключения, которые создаются в методе (кроме RuntimeException, Error и их подклассов), должны быть объявлены в предложении throws в заголовке метода, для них должны быть предусмотрены блоки cath в вызывающем блоке. Формат:
Тип_метода имя_метода (список параметров) trows список исключений
исключения описаны внутри пакета java.lang, который неявно импортирован во все классы программы. Большинство исключений класса RuntineException и подклассов Exception встроены (доступны автоматически). Они не компилируются (не проверяются) компилятором и именуются неконтролируемыми исключениями.
Другие, такие как ClassNotFoundException (класс не найден), NoSuchFildException, NoSuchMothodException и др.( такой метод не существует) (контролируемые) должны быть внесены в список trows, если метод может генерировать какое-то из них, но не обрабатывает его (смотри Help).
Собственные подклассы исключений можно создавать наследованием (extends) от класса Exception, получая таким образом доступ к методам, класса Throwable.
Архитектурный домен подклассов Throwable
Cтруктура определения подкласса класса Exception:
Class MyExceptionOne exetends Exception
{объявление переменных
MyException One() {........}// конструктор для инициализации переменных: //методы класса ….
}.
Если исключение не обрабатывается в программе. То оно захватывается обработчиком по умолчанию, определенным в Java. Стандартная обработка: выдача строки, описывающей исключение и распечатка трассы, откуда произошло исключение. (фактически описание имени файла и номера строки подпрограммы и т.д.). Выдается так же тип выбрасываемого исключения.
Несколько разделов catch
В некоторых случаях один и тот же блок программного кода может воз-буждать исключения различных типов. Для того, чтобы обрабатывать по-добные ситуации, Java позволяет использовать любое количество catch-разделов для try-блока. Наиболее специализированные классы исключений должны идти первыми, поскольку ни один подкласс не будет достигнут, если поставить его после суперкласса. Следующая про-грамма перехватывает два различных типа исключений, причем за этими двумя специализированными обработчиками следует раздел catch общего назначения, перехватывающий все подклассы класса Throwable.
class MultiCatch {
public static void main(String args[]) {
try {
int a = args.length;
System.out.println("a = " + a);
int b = 42 / a;
int c[] = { 1 };
c[42] = 99;
}
catch (ArithmeticException e) {
System.out.println("div by 0: " + e);
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("array index oob: " + e);
}
}
}
Этот пример, запущенный без параметров, вызывает возбуждение ис-ключительной ситуации деления на нуль. Если же мы зададим в командной строке один или несколько параметров, тем самым установив а в значение боль-ше нуля, наш пример переживет оператор деления, но в следующем опе-раторе будет возбуждено исключение выхода индекса за границы масси-ва ArrayIndexOutOf Bounds. Ниже приведены результаты работы этой программы, за-пущенной и тем и другим способом.
С:\> java MultiCatch
а = 0
div by 0: java.lang.ArithmeticException: / by zero
C:\> java MultiCatch 1
a = 1
array index oob: java.lang.ArrayIndexOutOfBoundsException: 42
Вложенные операторы try
Операторы try можно вкладывать друг в друга аналогично тому, как можно создавать вложенные области видимости переменных. Если у оператора try низкого уровня нет раздела catch, соответствующего возбужденному исключению, стек будет развернут на одну ступень выше, и в поисках подходящего обработчика будут прове-рены разделы catch внешнего оператора try. Вот пример, в котором два оператора try вложены друг в друга посредством вызова метода.
class MultiNest {
static void procedure() {
try {
int c[] = { 1 };
c[42] = 99;
}
catch(ArrayIndexOutOfBoundsException e) {
System.out.println("array index oob: " + e);
}
}
public static void main(String args[]) {
try {
int a = args.length();
System.out.println("a = " + a);
int b = 42 / a;
procedure();
}
catch (ArithmeticException e) {
System.out.println("div by 0: " + e);
}
}
}
throw
Оператор throw используется для возбуждения исключения <вруч-ную>. Для того, чтобы сделать это, нужно иметь объект подкласса клас-са Throwable, который можно либо получить как параметр оператора catch, либо создать с помощью оператора new. Ниже приведена общая форма оператора throw.
throw ОбъектТипаThrowable;
При достижении этого оператора нормальное выполнение кода немед-ленно прекращается, так что следующий за ним оператор не выполня-ется. Ближайший окружающий блок try проверяется на наличие соот-ветствующего возбужденному исключению обработчика catch. Если такой отыщется, управление передается ему. Если нет, проверяется следующий из вложенных операторов try, и так до тех пор пока либо не будет най-ден подходящий раздел catch, либо обработчик исключений исполняю-щей системы Java не остановит программу, выведя при этом состояние стека вызовов. Ниже приведен пример, в котором сначала создается объект-исключение, затем оператор throw возбуждает исключительную ситуацию, после чего то же исключение возбуждается повторно - на этот раз уже кодом перехватившего его в первый раз раздела catch.
class ThrowDemo {
static 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(NulPointerException e) {
System.out.println("recaught: " + e);
}
}
}
В этом примере обработка исключения проводится в два приема. Метод main создает контекст для исключения и вызывает demoproc. Метод demoproc также устанавливает контекст для обработки исключе-ния, создает новый объект класса NullPointerException и с помощью опе-ратора throw возбуждает это исключение. Исключение перехватывается в следующей строке внутри метода demoproc, причем объект-исключение доступен коду обработчика через параметр e. Код обработчика выводит сообщение о том, что возбуждено исключение, а затем снова возбуждает его с помощью оператора throw, в результате чего оно передается обра-ботчику исключений в методе main. Ниже приведен результат, получен-ный при запуске этого примера.
С:\> java ThrowDemo
caught inside demoproc
recaught: java.lang.NullPointerException: demo
throws
Если метод способен возбуждать исключения, которые он сам не об-рабатывает, он должен объявить о таком поведении, чтобы вызывающие методы могли защитить себя от этих исключений. Для задания списка исключений, которые могут возбуждаться методом, используется ключе-вое слово throws. Если метод в явном виде (т.е. с помощью оператора throw) возбуждает исключе-ние соответствующего класса, тип класса исключений должен быть ука-зан в операторе throws в объявлении этого метода. С учетом этого наш прежний синтаксис определения метода должен быть расширен следую-щим образом:
тип имя_метода(список аргументов) throws список_исключений {}
Ниже приведен пример программы, в которой метод procedure пыта-ется возбудить исключение, не обеспечивая ни программного кода для его перехвата, ни объявления этого исключения в заголовке метода. Такой программный код не будет оттранслирован.
class ThrowsDemo1 {
static void procedure() {
System.out.println("inside procedure");
throw new IllegalAccessException("demo");
}
public static void main(String args[]) {
procedure();
}
}
Для того, чтобы мы смогли оттранслировать этот пример, нам при-дется сообщить транслятору, что procedure может возбуждать исключе-ния типа IllegalAccessException и в методе main добавить код для обработки этого типа исключений :
class ThrowsDemo {
static void procedure() throws IllegalAccessException {
System.out.println(" inside procedure");
throw new IllegalAccessException("demo");
}
public static void main(String args[]) {
try {
procedure();
}
catch (IllegalAccessException e) {
System.out.println("caught " + e);
}
}
}
Ниже приведен результат выполнения этой программы.
С:\> java ThrowsDemo
inside procedure
caught java.lang.IllegalAccessException: demo
Оператор finally.
Используется для устранения негативных последствий после появления исключительных ситуаций. Он располагается после оператора catch. Так, если, например, файл открыт и из него неверно прочитана запись, то возникает исключительная ситуация, после обработки которой необходимо осуществить некоторые действия по восстановлению работоспособности (например, закрыть сбойный файл).
В этом случае метод для закрытия этого файла вызывается в блоке finally.
Следует учесть, что finally выполняется всегда, независимо от того, что произошло в блоке try.
Если в блоке генерируется исключительная ситуация, передаваемая на обработку за пределы данного метода, а затем в finally генерируется другая исключительная ситуация, то при выполнении программы в среде первая из них будет потеряна, что может быть источником проблем в приложении.
class Except1 extends Exception
{ public String toString()
{
return " * exception1 *";
}
}
class Except2 extends Except1
{ public String toString()
{
return " * exception2 *";
}
}
class Except3 extends Except2
{ public String toString()
{
return " * exception3 *";
}
}
class A
{
void fun() throws Except1,Except3
{
throw new Except2();
}
}
public class Exep1
{
static int count = 0;
public static void main(String[] args)
{
while(true)
{
try
{
System.err.println("count = "+count);
A ob= new A();
if(count == 0) ob.fun();
if(count == 2) throw new Except1(); // Пост-инкремент, вначале равен нулю:
System.out.println("No exception");
}
catch(Except1 e)
{
System.err.println("Exception---> "+e.toString());
}
finally
{
System.err.println("== finally bloc ==\n");
if(count == 4) break; // выйти из "while"
count++;
}
}
}
}
Java - объектно-ориентированный язык 2
Виртуальная Java-машина. 2
Некоторые особенности Java от С++ 3
Алфавит языка Java 4
Типы данных 4
Числа высокой точности 6
Переменные в Java 6
Объявление переменной 6
Область действия и время жизни переменной 7
Операции в Java 7
Арифметические операции 8
Логические операции 8
Побитовые операции 9
Операции сдвига 9
Тернарный оператор ?: 10
Оператор запятая 10
Одномерные массивы 10
Многомерные массивы 12
Функции 12
Класс 13
Поля и методы 13
Модификаторы доступа 14
Инициализация и очистка 15
Перегрузка методов 15
Ключевое слово this 16
Вызов конструктора из конструктора 17
Использование объектов в качестве параметров 18
Ключевое слово static 19
Спецификатор final 20
Вложенные и внутренние классы 20
Сборщик «мусора» 21
Как работает сборщик мусора 21
Наследование 25
Основы наследования 25
Использование ключевого слова super 27
Использование super для вызова конструктора суперкласса 27
Использование super для доступа к скрытым членам суперкласса 29
Конструкторы при наследовании 30
Динамическая диспетчеризация методов 31
Абстрактные классы 32
Использование final с наследованием 34
Использование final для отказа от переопределения 34
Использование final для отмены наследования 34
Класс Object 35
Пакеты и интерфейсы 35
Пакеты 35
Оператор package 35
Оператор import 36
Уровни доступа. 38
Интерфейсы 38
Оператор implements 39
Частичные реализации 42
“Множественное” наследование в Java 42
Конфликты имен при комбинировании интерфейсов 44
Расширение интерфейса 44
Группировка констант 45
Инициализирование полей в интерфейсах 47
Вложенные интерфейсы 47
Стандартный ввод/вывод 50
Чтение из стандартного ввода 50
Замена System.out на PrintWriter 51
Первое приложение Java 51
Исключительные ситуации. Обработка исключений 51
Типы исключений 52