
java_lec5 - копия.ppt
- Количество слайдов: 32
Передача управления Необходима для преждевременного выхода из цикла 1
o Стандартный оператор goto не включен в язык, хотя зарезервированное слово осталось o оператор break — завершает выполнение цикла, внутри которого записан (в языке предусмотрен также break с меткой); o оператор continue — выполняет переход к следующей итерации цикла; o оператор return — выполняет выход из функции, внутри которой он записан; o оператор throw — генерирует исключительную ситуацию; 2
Инструкция break, помимо использования в конструкции case, используется также в циклических конструкциях. break прекращает выполнение цикла. 2 формы break: o безымянная break; o именованная break метка; Метка – любой допустимый идентификатор за которым следует двоеточие 3
break package javaapplication 1; import java. util. *; public class Java. Application 1 { public static void main(String[] args) { double Xn = -2, Xk = 12, d. X = 2, t = 2, y; System. out. println( "| x | y "); for ( double x = Xn; x <= Xk; x += d. X ) { if (x>10) break; y = t * x; System. out. println( "| "+x+" | "+y+" | "); } } РЕЗУЛЬТАТ: | x | y | -2. 0 | -4. 0 | | 0. 0 | | 2. 0 | 4. 0 | 8. 0 | | 6. 0 | 12. 0 | | 8. 0 | 16. 0 | | 10. 0 | 20. 0 | 4
1*1=1 3*3=9 1*2=2 3 * 4 = 12 1*3=3 3 * 5 = 15 1*4=4 ------1*5=5 4*1=4 ------4*2=8 2*1=2 4 * 3 = 12 package javaapplication 1; 2*2=4 4 * 4 = 16 import java. util. *; 2*3=6 4 * 5 = 20 2*4=8 ------public class Java. Application 1 2 * 5 = 10 5*1=5 { ------5 * 2 = 10 public static void main(String[] args) 3*1=3 5 * 3 = 15 { 3*2=6 5 * 4 = 20 for (int i=1; i<10; i++) // область видимости i ограничена блоком Таблица умножения и break { } for (int k=1; k<10; k++) { if (k>5) break; System. out. println(i+" * "+k+" = "+i*k); } System. out. println("-------"); }
Таблица умножения и break с меткой package javaapplication 1; import java. util. *; public class Java. Application 1 { public static void main(String[] args) { m: for (int i=1; i<10; i++) { 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 1*6=6 1*7=7 1*8=8 1*9=9 ------2*1=2 2*2=4 2*3=6 2*4=8 2 * 5 = 10 2 * 6 = 12 2 * 7 = 14 2 * 8 = 16 2 * 9 = 18 ------3*1=3 3*2=6 3*3=9 3 * 4 = 12 3 * 5 = 15 вышли из цикла по метке m for (int k=1; k<10; k++) { if (k>5 && i>2) { k=1; break m; } System. out. println(i+" * "+k+" = "+i*k); } System. out. println("-------"); } System. out. println("вышли из цикла по метке m"); } } Таблица умножения для чисел от 1 до 2, а для числа 3 только результаты умножения на числа, меньшие 6
break с меткой РЕЗУЛЬТАТ: | x y Цикл по j работает | -2. 0 | -4. 0 | | 2. 0 | 4. 0 | Цикл по j работает | 4. 0 | 8. 0 | Цикл по j работает | 6. 0 12. 0 Цикл по j работает | 8. 0 | 16. 0 | Цикл по j работает | 10. 0 | 20. 0 | Цикл по j работает | 12. 0 | 24. 0 | public class Java. Application 1 { public static void main(String[] args) { double Xn = -2, Xk = 12, d. X = 2, t = 2, y; System. out. println( "| x | y "); for ( double x = Xn; x <= Xk; x += d. X ) { print. Mor: for (int j=0; j<1; j++) { if (x==0) { x += d. X; break print. Mor; } else System. out. println("Цикл по j работает"); } y = t * x; System. out. println( "| "+x+" | "+y+" | "); }}} 7
Инструкция continue Применяется только в циклических конструкциях. Передает управление в конец тела цикла. 2 формы break: o безымянная continue; o именованная continue метка; Используется для пропуска определенных значений из интервала изменения переменной цикла, которые должны игнорироваться или впоследствии обрабатываться особым образом 8
continue package javaapplication 1; import java. util. *; public class Java. Application 1 { public static void main(String[] args) { double Xn = -2, Xk = 12, d. X = 2, t = 2, y; System. out. println( "| x | y "); for ( double x = Xn; x <= Xk; x += d. X ) { if (x<5) continue; y = t * x; System. out. println( "| "+x+" | "+y+" | "); } } РЕЗУЛЬТАТ: | x | y | 6. 0 | 12. 0 | | 8. 0 | 16. 0 | | 10. 0 | 20. 0 | | 12. 0 | 24. 0 | 9
1*1=1 3*1=3 1*2=2 3*2=6 1*3=3 3*3=9 1*4=4 3 * 4 = 12 1*8=8 3 * 8 = 24 1*9=9 3 * 9 = 27 ------------package javaapplication 1; 2*1=2 4*1=4 import java. util. *; 2*2=4 4*2=8 2*3=6 4 * 3 = 12 public class Java. Application 1 2*4=8 4 * 4 = 16 { 2 * 8 = 16 4 * 8 = 32 public static void main(String[] args) 2 * 9 = 18 4 * 9 = 36 { ------------for (int i=1; i<10; i++) // область видимости i ограничена блоком Таблица умножения и continue { } for (int k=1; k<10; k++) { if (k>=5 && k<=7) continue; System. out. println(i+" * "+k+" = "+i*k); } System. out. println("-------"); } } Таблица умножения чисел от 1 до 9 на числа от 1 до 4 и от 8 до 9
Инструкция return позволяет немедленно завершить выполнение метода и передать управление коду, который вызвал данный метод. 11
Return [ выражение ]; завершает выполнение функции и передает управление в точку ее вызова: package javaapplication 1; import java. util. *; public class Java. Application 1 { public static void main(String[] args) { System. out. println(Sum. M()); } public static int Sum. M() { int n=3; return n; } } 12
Обработка исключений При вычислении выражений могут возникнуть ошибки (переполнение, деление на ноль). В Java существует механизм обработки исключительных ситуаций (исключений), который позволяет избегать аварийного завершения программы. 1
Понятие «исключительная ситуация» Исключение в Java - это объект, который описывает исключительное состояние, возникшее в каком-либо участке программного кода. Если в процессе вычислений возникла ошибка, система сигнализирует об этом с помощью выбрасывания (генерирования) исключения. Когда возникает исключительное состояние, создается объект класса Exception. Этот объект пересылается в метод, обрабатывающий данный тип исключительной ситуации. Наличие такого механизма позволяет «защитить» определенные участки кода от возникновения нештатных ситуаций различного рода, произвести их разумную обработку и перевести программу из возможного аварийного состояния (например, «зависания» ) в работоспособное, т. е. дать возможность продолжить ее выполнение, даже тогда, когда возникла ошибка времени выполнения. 14
Понятие «исключительная ситуация» o Каждому типу ошибки соответствует свое исключение. Исключения являются классами, которые имеют общего предка — класс Throwable, определенный в пакете java. lang o Например, при делении на ноль будет выброшено исключение java. lang. Arithmetic. Exception: / by zero, при переполнении массива— исключение Array. Index. Out. Bounds. Exception. o В программе необходимо предусмотреть обработку исключений. o Исключения могут возбуждаться и «вручную» для того, чтобы сообщить о некоторых нештатных ситуациях. 15
Иерархия базовых исключений Все классы исключений создают собственную иерархию, на вершине которой находится класс Throwable. Два непосредственных наследника класса Throwable делят иерархию подклассов исключений на две различные ветви: oкласс Ехception используется для описания исключительных ситуации, которые должны перехватываться программным кодом пользователя; oкласс Error, описывающий исключительные ситуации, которые при обычных условиях не могут быть перехвачены в пользовательской программе.
Класс java. lang. Throwable объект которого содержит информацию о стеке исполнения потока Конструкторы: Throwable() Создает новый объект на основе информации о стеке текущего потока Throwable(String message) Создает новый объект на основе информации о стеке текущего потока плюс позволяет задать текст сообщения об ошибке Throwable(Throwable cause) Создает новый объект – обертку вокруг другого объекта Throwable. Стек вызовов заполняется на основе информации о стеке текущего потока Throwable(String message, Throwable cause) Создает объект-обертку с возможностью переопределения сообщения 17
Класс java. lang. Throwable (полезные методы) String get. Message() String get. Localized. Message() Возвращает текст сообщения об ошибке print. Stack. Trace() print. Stack. Trace(Print. Stream s) print. Stack. Trace(Print. Writer s) Выводит информацию о стеке вызовов на момент возникновения ошибки. Распечатка ведется на стандартный поток ошибок или в указанный поток native Throwable fill. In. Stack. Trace() Заполняет информацию о стеке вызовов для текущего потока в объект Throwable и возвращает ссылку на этот -же объект. Используется конструкторами. init. Cause(Throwable cause) Throwable get. Cause() Манипуляция с объектом-источником (для оберток) Stack. Trace. Element[ ] get. Stack. Trace() set. Stack. Trace(Stack. Trace. Elem ent[ ] stack. Trace) Позволяет работать с элементами стека вызовов 18
Обработка исключений o Исключительная ситуация, или исключение — это возникновение непредвиденного или аварийного события, которое может порождаться некорректным использованием аппаратуры. o Например, это неверное приведение типов, обращение по несуществующему адресу памяти, выход за пределы массива. o Исключения позволяют логически разделить вычислительный процесс на две части — обнаружение аварийной ситуации и ее обработка.
Обработка исключений Такие исключительные ситуации (исключения) могут возникать в процессе выполнения программы и их автоматическая обработка приводит к прерыванию программы class Exc 0 { public static void main(String args[ ]) { int d = (int) (Math. random()*2); int a = 42 / d; } } Если возникнет ситуация, когда d=0, то вывод, полученный при запуске нашего примера. Exception in thread "main" java. lang. Arithmetic. Exception: / by zero at Exc 0. main(Exc 0. java: 45)
Возможные действия при ошибке oпрервать выполнение программы; oвозвратить значение, означающее «ошибка» ; oвывести сообщение об ошибке и вернуть вызывающей программе некоторое приемлемое значение, которое позволит ей продолжать работу; oвыбросить исключение Исключения генерирует либо система выполнения, либо программист с помощью оператора throw.
Возможные действия при ошибке Наличие такого механизма дает возможность «перехватить» исключение, провести его обработку и продолжить выполнение программы без прерывания. class Exc 1 { public static void main(String args[ ]) try { int d = (int) (Math. random()*2); int a = 42 / d; } catch (Arithmetic. Exception e) {System. out. println("Division by zero"); } System. out. println("Несмотря на это, мы продолжаем!"); } Если возникнет ситуация, когда d=0, то вывод, полученный при запуске нашего примера. Division by zero Несмотря на это, мы продолжаем!
Оператор try - перехват исключений Служит для обнаружения и обработки исключений. Оператор содержит три части: o контролируемый блок — составной оператор, предваряемый ключевым словом try. В контролируемый блок включаются потенциально опасные операторы программы. Все функции, прямо или косвенно вызываемые из блока, также считаются ему принадлежащими; o один или несколько обработчиков исключений — блоков catch, в которых описывается, как обрабатываются ошибки различных типов; o блок завершения finally, выполняемый независимо от того, возникла ли ошибка в контролируемом блоке. Синтаксис оператора try: try блок [ catch-блоки ] [ finally-блок ]
Механизм обработки исключений o Обработка исключения начинается с появления ошибки. Функция или операция, в которой возникла ошибка, генерируют исключение; o Выполнение текущего блока прекращается, отыскивается соответствующий обработчик исключения, и ему передается управление. o В любом случае (была ошибка или нет) выполняется блок finally, если он присутствует. o Если обработчик не найден, вызывается стандартный обработчик исключения.
public static void main(String[] args) { try { Scanner in = new Scanner(System. in); System. out. println( "Введите напряжение: " ); double u = in. next. Double(); System. out. println( "Введите сопротивление: " ); double r = in. next. Double(); double i = u / r; System. out. println( "Сила тока - " + i ); } catch (Exception e ) { System. out. println( e. get. Message()); } }
В одном блоке программного кода могут возникать исключения различных типов. Для этого в Java можно использовать любое количество catch-разделов для try-блока. try { // Контролируемый блок } catch ( IOException e) { // Действия при ошибках ввода/вывода } catch ( Malformed. URLException e 1 ) { // Действия в случае некорректного формата URL } catch ( Unknown. Host. Exception e 2) { // Действия в случае, если URL не существует } catch { // Обработка всех остальных исключений }
Вложенные операторы try Операторы try можно вкладывать друг в друга аналогично тому, как можно создавать вложенные области видимости переменных. Если у оператора try низкого уровня нет раздела catch, соответствующего возбужденному исключению, стек будет развернут на одну ступень выше, и в поисках подходящего обработчика будут проверены разделы catch внешнего оператора try. Если ни у одного из вложенных блоков try не найдется подходящего обработчика catch, программа обработает исключение в автоматическом режиме и выдаст содержимое стэка выполнения.
finally Иногда требуется гарантировать, что определенный участок кода будет выполняться независимо от того, какие исключения были возбуждены и перехвачены. Для создания такого участка кода используется ключевое слово finally. Даже в тех случаях, когда в методе нет соответствующего возбужденному исключению раздела catch, блок finally будет выполнен до того, как управление перейдет к операторам, следующим за разделом try. У каждого раздела try должен быть по крайней мере или один раздел catch или блок finally. Блок finally очень удобен для закрытия файлов и освобождения любых других ресурсов, захваченных для временного использования в начале выполнения метода.
finally class Exc 1 {public static void main(String[] args) { try { int d = (int) (Math. random()*2); int a = 42 / d; } catch (Arithmetic. Exception e) {System. out. println("Division by zero"); } finally {System. out. println("мы продолжаем, даже если было деление!"); } } } Division by zero мы продолжаем, даже если было деление!
Оператор throw используется для возбуждения исключения «вручную» . Для того, чтобы сделать это, нужно иметь объект подкласса Throwable, который можно либо получить как параметр оператора catch, либо создать с помощью оператора new. (например new EOFException(); ) throw Объект. Типа. Throwable; При достижении этого оператора нормальное выполнение кода немедленно прекращается. Ближайший окружающий блок try проверяется на наличие соответствующего возбужденному исключению обработчика catch. Если такой отыщется, управление передается ему. Если нет, проверяется следующий из вложенных операторов try, и так до тех пор пока либо не будет найден подходящий раздел catch, либо обработчик исключений исполняющей системы Java не остановит программу, выведя при этом состояние стека вызовов.
Оператор throw Если метод способен возбуждать исключения, которые он сам не обрабатывает, он должен объявить о таком поведении, чтобы вызывающие методы могли защитить себя от этих исключений. Для задания списка исключений, которые могут возбуждаться методом, используется ключевое слово throws. Если метод в явном виде (т. е. с помощью оператора throw) возбуждает исключение соответствующего класса, тип класса исключений должен быть указан в операторе throws в объявлении этого метода. С учетом этого наш прежний синтаксис определения метода должен быть расширен следующим образом: тип имя_метода(список аргументов) throws список_исключений { }
Создание собственных исключений (подклассов Exception) Механизм генерации и обработки исключений можно подстроить для решения собственных задач. class My. Exception extends Exception { private int detail; Создается класс My. Exception – наследник класса Exception. У этого подкласса есть My. Exception(int a) { специальный конструктор, который записывает в detail = a; переменную объекта целочисленное значение, и } совмещенный метод to. String, выводящий public String to. String() { значение, хранящееся в объекте-исключении. return "My. Exception[" + detail + "]"; } Класс Exception. Demo } определяет метод compute, class Exception. Demo { который возбуждает (throw), но static void compute(int a) throws My. Exception { сам не обрабатывает (throws) System. out. println("called computer + a + "). "); исключение типа My. Excepton. Исключение возбуждается, когда if (a > 10) значение параметра метода throw new My. Exception(a); больше 10. System. out. println("normal exit. "); } public static void main(String args[]) { Метод main в защищенном блоке вызывает метод compute сначала с допустимым try { значением, а затем - с недопустимым (больше compute(1); 10), что позволяет продемонстрировать работу compute(20); при обоих путях выполнения кода. } catch (My. Exception e) { called compute(1). System. out. println("caught" + e); normal exit. called compute(20). } caught My. Exception[20] }}
java_lec5 - копия.ppt