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

Содержание

Слайд 2

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

Содержание

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

Слайд 3

Блок Блок объединяет в один синтаксический элемент несколько самостоятельных элементов Блок

Блок

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

видимости локальных переменных
Блок используется для структурирования кода
Слайд 4

Блок Блок содержит Операторы Объявления локальных переменных Объявления локальных классов Вложенные

Блок

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

фигурные скобки
{
// тело блока
}
Слайд 5

Блок Нельзя объявлять несколько локальных переменных в пределах видимости блока void

Блок

Нельзя объявлять несколько локальных переменных в пределах видимости блока
void someMeth() {int

x; int x = 0;}
Локальные переменные перекрывают видимость полей класса
public class Test {
int x = 5;
void meth() { int x = 1; System.out.println(x); }
}
Слайд 6

Блок Блок может иметь метку [Label:] { // тело блока }

Блок

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

языках не рекомендуется
Слайд 7

Метка class Test { void meth() { int x = 0;

Метка

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) Циклы Массивы Исключения

Содержание

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

Слайд 9

Оператор условного перехода if (логическое_выражение) выражение_1 или блок_1 [else выражение_2 или

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

if (логическое_выражение)
выражение_1 или блок_1
[else
выражение_2 или блок_2]
Логическое

выражение обязательно возвращает булевский тип значения
Часть else может быть опущена
Слайд 10

Каскадирование оператора if if (выражение_1) блок_1 else if (выражение_2) блок_2 else

Каскадирование оператора 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); }

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

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

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

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 switch(i) { case 0:

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

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 switch(i) { case 0:

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

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 switch(i) { case 0:

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

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) Массивы Исключения

Содержание

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

Слайд 17

Оператор цикла for for (выражение_инициализации; логическое_выражение; выражение_обновления) блок Оператор выполняется до

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

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

имеет значение «истина»
Логическое выражение проверяется до начала итерации
Выражение инициализации выполняется один раз
Выражение обновления выполняется после выполнения блока
Слайд 18

Оператор цикла for double num, sroot; for(num = 1.0;num sroot =

Оператор цикла 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; ifor (int i=0;i<10;) {
println(i); i++; }
Слайд 19

Оператор цикла for int i=0; for (;i println(i); i++; } Бесконечный

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

int i=0;
for (;i<10;) {
println(i); i++; }
Бесконечный цикл
for

(;;) { }
Цикл без тела
for (i=1; i<=5;sum+=i++);
println(sum);
Слайд 20

Оператор цикла while while (логическое_выражение) выражение или блок Оператор выполняется до

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

while (логическое_выражение)
выражение или блок
Оператор выполняется до тех пор,

пока выражение имеет значение «истина»
Никаких дополнительных ограничений не предусмотрено
Требуется изменять логическое выражение
Требуется внимательно контролировать ветвления внутри цикла
Слайд 21

Оператор цикла while char ch; while (ch print(ch); ch++; } int i=0; while(i++ println(i); }

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

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

println(i);
}
Слайд 22

Оператор цикла do do выражение или блок while (логическое_выражение); Оператор выполняется

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

do
выражение или блок
while (логическое_выражение);
Оператор выполняется до тех пор, пока

выражение имеет значение «истина»
Оператор выполняется как минимум один раз.
Никаких дополнительных ограничений не предусмотрено
Слайд 23

Операторы прерывания break [label]; Прерывает выполнение блока При указании метки –

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

break [label];
Прерывает выполнение блока
При указании метки – после прерывания

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

Операторы прерывания for(int j=0;j if (j%2==0) continue; print(“i=” +i); } outerloop:

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

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 if (i*i>=num) break; print(“i=” +i); } print(“done”);

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

num = 100;
for(int i=0;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];

Массив

Инициализация массива
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

Массив

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] if (nums[i]>max) max = nums[i];
}
print(max,min);
}
}
Слайд 30

Размер массива Задается при создании int a[] = new int[5]; Доступна

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

Задается при создании
int a[] = new int[5];
Доступна в специальном свойстве


int length = a.length;
Индексация начинается с «0»
Ошибка индексации – ошибка времени исполнения программы
Слайд 31

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

Содержание

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

Слайд 32

Исключения Традиционная работа с ошибками Предварительная проверка условий Проверка результата исполнения

Исключения

Традиционная работа с ошибками
Предварительная проверка условий
Проверка результата исполнения
Незащищенность от непредусмотренных ошибок
Обработка

исключений
Пробуем сделать то, что хотим... и разбираемся с последствиями
Можно обработать и непредусмотренные ситуации
Слайд 33

Исключения Типы ошибок Runtime error (ошибка времени исполнения) Деление на ноль,

Исключения

Типы ошибок
Runtime error (ошибка времени исполнения)
Деление на ноль, обращение по null-ссылке,

выход за границы массива…
Явное порождение ошибки (throw)
Асинхронные (внешние) ошибки
Сбои виртуальной машины
Внешнее прерывание работы потока
Слайд 34

Места возникновения ошибок Метод Управление передается в место, откуда метод был

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

Метод
Управление передается в место, откуда метод был вызван
Конструктор
Управление передается

в место создания экземпляра объекта
Статический инициализатор
Управление передается в место первого обращения к классу
Слайд 35

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

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

Слайд 36

Что такое «исключение» Исключение – объект, экземпляр класса, унаследованного от java.lang.Throwable;

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

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

в месте и в момент возникновения ошибки;
обрабатываемый в JVM по особым правилам;
содержащий необходимую информацию о сути возникшей ошибки
Слайд 37

Методы Throwable printStackTrace() Вывод на экран информации о сути и месте

Методы Throwable

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

строкового сообщения об ошибке (без указания места возникновения)
toString()
Получение строкового представления Exception
Слайд 38

Обработка исключений try catch finally throw throws

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

try
catch
finally
throw
throws

Слайд 39

Конструкция try-catch try { блок } // Пробуем выполнить catch (Exception_1

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

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


catch (Exception_2 e2) {
блок } …
[ finally {
блок }
Слайд 40

public class ExcDemo1 { public static void main(String args[]) { int

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

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

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)

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

public class ExcDemo1 { public static void main(String args[]) { for

public class ExcDemo1 {
public static void main(String args[]) {
for (int i

= 0; i<3; i++) {
UseFinally.useFinally(i);
} } }
class UseFinally {
public static void useFinally(int k) {
int num[] = new int[2];
int t;
try {
switch (k) {
case 0:
t = 2 / k; break;
case 1:
t = num[4]; break;
case 2:
return;
}
}
catch (ArrayIndexOutOfBoundsException exc) {
System.out.println("index out of bounds");
}
catch (ArithmeticException exc) {
System.out.println("devision by zero");
}
finally {
System.out.println("finally");
} } }
Слайд 46

Правила исполнения Выполняется блок try При возникновении исключения производится поиск соответствующего

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

Выполняется блок try
При возникновении исключения производится поиск соответствующего catch
Исключение –

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

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

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

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

внутри блока catch
Блок finally выполняется, ошибка передается выше
Ошибка внутри блока finally
ошибка передается выше
Слайд 48

Самостоятельный вызов Exception throw new Exception(“Exception”); Аналогично возникновению ошибки в данном

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

throw new Exception(“Exception”);

Аналогично возникновению ошибки в данном месте программы
В

качестве аргумента получает экземпляр (объект) ? необходима инициализация
Может использоваться в обработчиках ошибок: обрабатываем, а затем «пробрасываем» дальше.
Слайд 49

public class ExcDemo1 { public static void main(String args[]) { try

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 Во время

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

Проверяемые исключения
наследники класса Exception
Во время компиляции контролируется,

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

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

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

Слайд 52

Самостоятельное определение исключений Создается класс – наследник Throwable или Exception; RuntimeException;

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

Создается класс – наследник Throwable или
Exception;
RuntimeException;
любого другого класса в

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

public class ExcDemo1 { public static void main(String args[]) { int

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

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

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

Содержание

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