Лекция 6
Содержание
Блок
Блок
Блок
Блок
Метка
Содержание
Оператор условного перехода
Каскадирование оператора if
Оператор условного перехода
Оператор выбора
Оператор выбора
Оператор выбора
Оператор выбора
Содержание
Оператор цикла for
Оператор цикла for
Оператор цикла for
Оператор цикла while
Оператор цикла while
Оператор цикла do
Операторы прерывания
Операторы прерывания
Операторы прерывания
Содержание
Массив
Массив
Массив
Размер массива
Содержание
Исключения
Исключения
Места возникновения ошибок
Иерархия исключений
Что такое «исключение»
Методы Throwable
Обработка исключений
Конструкция try-catch
Иерархия исключений
Правила исполнения
Когда ошибка не обрабатывается
Самостоятельный вызов Exception
Проверяемые и непроверяемые исключения
Иерархия исключений
Самостоятельное определение исключений
Контроль логической целостности кода
Содержание
Содержание
302.50K
Категория: ПрограммированиеПрограммирование

Операторы и структура кода. Исключения. (Лекция 6)

1. Лекция 6

Операторы и структура кода.
Исключения.

2. Содержание


Блоки
Циклы
Логические операторы
Массивы
Исключения

3. Блок

• Блок объединяет в один синтаксический
элемент несколько самостоятельных
элементов
• Блок ограничивает область видимости
локальных переменных
• Блок используется для структурирования
кода

4. Блок

• Блок содержит
– Операторы
– Объявления локальных переменных
– Объявления локальных классов
– Вложенные блоки
– Пустой оператор “;”
• Блок заключается в фигурные скобки
{
// тело блока
}

5. Блок

• Нельзя объявлять несколько локальных
переменных в пределах видимости блока
void someMeth() {int x; int x = 0;}
• Локальные переменные перекрывают
видимость полей класса
public class Test {
int x = 5;
void meth() { int x = 1; System.out.println(x); }
}

6. Блок

• Блок может иметь метку
[Label:] {
// тело блока
}
Использование меток в объектноориентированных языках не
рекомендуется

7. Метка

class Test {
void meth() {
int x = 0;
Test: for(int i=0; i<10;i++) {
test: for(int j=0; j<10;j++) {
if (i*j>50) break Test;
}
}
}
}

8. Содержание

• Блоки
• Логические операторы (if-else,
switch)
• Циклы
• Массивы
• Исключения

9. Оператор условного перехода

if (логическое_выражение)
выражение_1 или блок_1
[else
выражение_2 или блок_2]
• Логическое выражение обязательно возвращает
булевский тип значения
• Часть else может быть опущена

10. Каскадирование оператора if

if (выражение_1) блок_1
else if (выражение_2) блок_2
else if (выражение_3) блок_3

else блок_N
• else относится к ближайшему if
• при выполнении первого условия if дальнейшее
выполнение каскада прекращается

11. Оператор условного перехода

if (x!=0) {
z = y/x;
System.out.println(z);
} else System.out.println(“Попытка деления на ноль”);
if (x>4) {
z = 2*x-1;
} else if (x<0) {
z = x+14;
} else z = x;

12. Оператор выбора

switch (выражение) {
case const1: выражение_1 или блок_1
case const2: выражение_2 или блок_2

[default: выражение_N или блок_N]
}
Выражение типа byte, short, int, char (начиная с JDK 7 + String)
const – целочисленный литерал или переменная final static
оператор выполняется от первого совпадения до конца!
проверки совпадения производятся сверху вниз

13. Оператор выбора

int i;
for (i=0; i<10; i++)
switch(i) {
case 0:
print(“i is zero”);
break;
case 1:
print(“i is one”);
break;
case 2:
print(“i is two”);
break;
default:
print(“i is three or more”);
}

14. Оператор выбора

int i;
for (i=0; i<=3; i++)
switch(i) {
case 0:
print(“i is less than one”);
case 1:
print(“i is less than two”);
case 2:
print(“i is less than three”);
}

15. Оператор выбора

int i;
for (i=0; i<=3; i++)
switch(i) {
case 0:
case 1:
print(“i is 0 or 1”);
case 2:
print(“i is two”);
break;
}

16. Содержание


Блоки
Логические операторы
Циклы (for, while, do-while)
Массивы
Исключения

17. Оператор цикла for

for (выражение_инициализации;
логическое_выражение;
выражение_обновления) блок
• Оператор выполняется до тех пор, пока выражение
имеет значение «истина»
• Логическое выражение проверяется до начала итерации
• Выражение инициализации выполняется один раз
• Выражение обновления выполняется после выполнения
блока

18. Оператор цикла for

double num, sroot;
for(num = 1.0;num<100.0;num++) {
sroot = Math.sqrt(num); println(sroot); }
int i,j;
for (i=0,j=10; i<j; i++,j--) println(i+“ ”+j);
for (int i=0;i<10;) {
println(i); i++; }

19. Оператор цикла for

int i=0;
for (;i<10;) {
println(i); i++; }
Бесконечный цикл
for (;;) { }
Цикл без тела
for (i=1; i<=5;sum+=i++);
println(sum);

20. Оператор цикла while

while (логическое_выражение)
выражение или блок
• Оператор выполняется до тех пор, пока выражение
имеет значение «истина»
• Никаких дополнительных ограничений не
предусмотрено
– Требуется изменять логическое выражение
– Требуется внимательно контролировать ветвления внутри
цикла

21. Оператор цикла while

char ch;
while (ch<=‘z’) {
print(ch);
ch++;
}
int i=0;
while(i++<5) {
println(i);
}

22. Оператор цикла do

do
выражение или блок
while (логическое_выражение);
• Оператор выполняется до тех пор, пока выражение
имеет значение «истина»
• Оператор выполняется как минимум один раз.
• Никаких дополнительных ограничений не
предусмотрено

23. Операторы прерывания

break [label];
Прерывает выполнение блока
При указании метки – после прерывания блока управление
передается блоку или оператору с данной меткой
continue [label];
Прерывает выполнение текущей итерации цикла
return [expression];
Прерывает выполнение метода
Тип выражения должен совпадать с типом возвращаемого
значения

24. Операторы прерывания

for(int j=0;j<10;j++) {
if (j%2==0) continue;
print(“i=” +i);
}
outerloop: for(int i=1;i<10;i++) {
print(“out” + I + “in”);
for(int j=1;j<10;j++) {
if (j==5) continue outerloop;
print(j);
}
}

25. Операторы прерывания

num = 100;
for(int i=0;i<num;i++) {
if (i*i>=num) break;
print(“i=” +i);
}
print(“done”);

26. Содержание


Блоки
Логические операторы
Циклы
Массивы
Исключения

27. Массив

• Массив – набор однотипных значений
– Отдельный элемент массива не имеет
имени
• Объявление массива
int a[];
int[] a;
int[] a[];
int a[][];

28. Массив

• Инициализация массива
int sample [ ] = new int [10];
for(int i=0;i<10;i++) {
sample[i] = i;
}
sample[0] = …; …
int sample [ ] = {1, 2, …};

29. Массив

class MinMax {
main() {
int nums[ ] = new int[10];
// инициализация
int min,max;
min = max = nums[0];
for(int i=1;i<10;i++) {
if (nums[i]<min) min = nums[i];
if (nums[i]>max) max = nums[i];
}
print(max,min);
}
}

30. Размер массива

• Задается при создании
int a[] = new int[5];
• Доступна в специальном свойстве
int length = a.length;
• Индексация начинается с «0»
• Ошибка индексации – ошибка времени
исполнения программы

31. Содержание


Блоки
Логические операторы
Циклы
Массивы
Исключения

32. Исключения

• Традиционная работа с ошибками
– Предварительная проверка условий
– Проверка результата исполнения
– Незащищенность от непредусмотренных
ошибок
• Обработка исключений
– Пробуем сделать то, что хотим... и
разбираемся с последствиями
– Можно обработать и непредусмотренные
ситуации

33. Исключения

• Типы ошибок
– Runtime error (ошибка времени
исполнения)
• Деление на ноль, обращение по null-ссылке,
выход за границы массива…
– Явное порождение ошибки (throw)
– Асинхронные (внешние) ошибки
• Сбои виртуальной машины
• Внешнее прерывание работы потока

34. Места возникновения ошибок

• Метод
– Управление передается в место, откуда
метод был вызван
• Конструктор
– Управление передается в место создания
экземпляра объекта
• Статический инициализатор
– Управление передается в место первого
обращения к классу

35. Иерархия исключений

36. Что такое «исключение»

• Исключение –
– объект, экземпляр класса, унаследованного
от java.lang.Throwable;
– порождаемый JVM в месте и в момент
возникновения ошибки;
– обрабатываемый в JVM по особым
правилам;
– содержащий необходимую информацию о
сути возникшей ошибки

37. Методы Throwable

• printStackTrace()
– Вывод на экран информации о сути и месте
возникновения ошибки
• getMessage()
– Получение строкового сообщения об ошибке (без
указания места возникновения)
• toString()
– Получение строкового представления Exception

38. Обработка исключений


try
catch
finally
throw
throws

39. Конструкция try-catch

try {
блок } // Пробуем выполнить
catch (Exception_1 e1) {
блок }
catch (Exception_2 e2) {
блок } …
[ finally {
блок }

40.

public class ExcDemo1 {
public static void main(String args[]) {
int nums[] = new int[4];
try {
System.out.println("before");
nums[7] = 10;
System.out.println("anything");
}
catch (ArrayIndexOutOfBoundsException exc) {
System.out.println("index out of bounds");
}
System.out.println("after");
}
}

41.

public class ExcDemo1 {
public static void main(String args[]) {
try {
ExcDemo2.getException();
}
catch (ArrayIndexOutOfBoundsException exc) {
System.out.println("index out of bounds");
}
System.out.println("after");
}
}
class ExcDemo2 {
static void getException() {
int nums[] = new int[4];
System.out.println("before");
nums[7] = 10;
System.out.println("anything");
}
}

42.

public class ExcDemo1 {
public static void main(String args[]) {
int nums[] = {4, 8, 16, 32, 64, 128, 256, 512};
int num2[] = {2, 0, 4, 2, 0, 8};
for (int i = 0; i<=7; i++) {
try {
System.out.println("before");
System.out.println(nums[i]/num2[i]);
}
catch (ArrayIndexOutOfBoundsException exc) {
System.out.println("index out of bounds");
}
catch (ArithmeticException exc) {
System.out.println("division by zero");
}
catch (Exception exc) {
System.out.println("some other exception");
}
}
System.out.println("after");
}
}

43. Иерархия исключений

44.

import java.util.Random;
public class Multicatch {
public static void main(String[] args) {
Random r = new Random();
int array[] = {0, 2};
int a, b;
for (int i=1;i<3;i++) {
try {
a = r.nextInt(3);
b = 10/array[a];
System.out.println(b);
}
catch (ArithmeticException exc) {
System.out.println("devision by zero");
}
catch (ArrayIndexOutOfBoundsException exc) {
System.out.println("out of bounds");
}
finally {
System.out.println("finally!");
}
}
}
}

45.

46. Правила исполнения

• Выполняется блок try
• При возникновении исключения производится
поиск соответствующего catch
– Исключение – класс, реализующий интерфейс
Throwable
– Соответствующий catch – catch, в котором указано
само исключение или его предок
– Блоки catch проверяются последовательно
– После нахождения нужного catch другие не
проверяются
• Блок finally выполняется в любом случае

47. Когда ошибка не обрабатывается

• Нет подходящего catch
– Блок finally выполняется, ошибка
передается выше
• Ошибка внутри блока catch
– Блок finally выполняется, ошибка
передается выше
• Ошибка внутри блока finally
– ошибка передается выше

48. Самостоятельный вызов Exception

throw new Exception(“Exception”);
• Аналогично возникновению ошибки в данном
месте программы
• В качестве аргумента получает экземпляр
(объект) необходима инициализация
• Может использоваться в обработчиках
ошибок: обрабатываем, а затем
«пробрасываем» дальше.

49.

public class ExcDemo1 {
public static void main(String args[]) {
try {
throw new ArithmeticException();
}
catch (ArithmeticException exc) {
System.out.println("oops. what have you done???");
}
}
}

50. Проверяемые и непроверяемые исключения

• Проверяемые исключения
– наследники класса Exception
• Во время компиляции контролируется, предусмотрена ли
обработка исключительной ситуации
• Требуется прописывать в сигнатуре метода (если не
обрабатываем внутри метода)
void someMeth() throws Exception_1, Exception_2, … { }
• Непроверяемые исключения
– наследники RuntimeException
• Обязательной обработки не требуется, компилятор
оставляет это на усмотрение разработчика
– наследники Error
• Программными средствами ошибку обработать
невозможно

51. Иерархия исключений

52. Самостоятельное определение исключений

• Создается класс – наследник Throwable или
– Exception;
– RuntimeException;
– любого другого класса в иерархии Exception
• В нужной ситуации
– Создается экземпляр класса;
– Его поля наполняются необходимой информацией;
– Объект отправляется на обработку с помощью
throw

53.

public class ExcDemo1 {
public static void main(String args[]) {
int nums[] = {4, 8, 15, 32, 64, 128, 257, 512};
int num2[] = {2, 0, 4, 2, 0, 8};
for (int i = 0; i<=7; i++) {
try {
if ((nums[i]%2) != 0) {
throw new NonIntResultException(nums[i],num2[i]);
} else
System.out.println(nums[i]/num2[i]);
}
catch (NonIntResultException exc) {
System.out.println(exc);
}
catch (ArrayIndexOutOfBoundsException exc) {
System.out.println("index out of bounds");
}
catch (ArithmeticException exc) {
System.out.println("division by zero");
} } } }
class NonIntResultException extends Exception {
int n, m;
NonIntResultException(int i, int j) {
n = i;
m = j;
}
public String toString() {
return "Result of " + n + "/" + m + " is not integer";
} }

54.

public class ExcDemo1 {
public static void main(String args[]) {
ExcDemo2 ed = new ExcDemo2();
for (int i = 0; i<=7; i++) {
try {
ed.useThrows(i);
}
catch (NonIntResultException exc) {
System.out.println(exc);
}
catch (ArrayIndexOutOfBoundsException exc) {
System.out.println("index out of bounds");
}
catch (ArithmeticException exc) {
System.out.println("division by zero");
} } } }
class NonIntResultException extends Exception {
int n, m;
NonIntResultException(int i, int j) {
n = i;
m = j;
}
public String toString() {
return "Result of " + n + "/" + m + " is not integer";
} }
class ExcDemo2 {
int nums[] = {4, 8, 15, 32, 64, 128, 257, 512};
int num2[] = {2, 0, 4, 2, 0, 8};
void useThrows(int i) throws NonIntResultException {
if ((nums[i]%2) != 0) {
throw new NonIntResultException(nums[i],num2[i]);
} else
System.out.println(nums[i]/num2[i]);
} }

55. Контроль логической целостности кода

• Проверка достижимости всех участков кода
– Компилятор сообщает о наличии участков кода,
недостижимых ни при каких условиях =
UnreachableCodeException
• Проверка обработки проверяемых исключений
– Если внутри метода есть throw, в его описании
должно быть throws с указанием нужного класса
– Если вызывается метод, который описан как throws,
либо должен быть try-catch c соответствующей
обработкой, либо вызывающий метод тоже throws.

56. Содержание


Блоки
Логические операторы
Циклы
Исключения

57. Содержание


Блоки
Циклы
Логические операторы
Массивы
Исключения
English     Русский Правила