Similar presentations:
Операторы и структура кода. Исключения. (Лекция 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) блок_1else 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. Содержание
Блоки
Циклы
Логические операторы
Массивы
Исключения