Лекция 6
1/57
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     Русский Правила