Слайд 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
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
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
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
}
int i,j;
for (i=0,j=10; i
for (int i=0;i<10;) {
println(i); i++; }
Слайд 19Оператор цикла for
int i=0;
for (;i
цикл
for (;;) { }
Цикл без тела
for (i=1; i<=5;sum+=i++);
println(sum);
Слайд 20Оператор цикла while
while (логическое_выражение)
выражение или блок
Оператор выполняется до тех пор,
пока выражение имеет значение «истина»
Никаких дополнительных ограничений не предусмотрено
Требуется изменять логическое выражение
Требуется внимательно контролировать ветвления внутри цикла
Слайд 21Оператор цикла while
char ch;
while (ch
{
println(i);
}
Слайд 22Оператор цикла do
do
выражение или блок
while (логическое_выражение);
Оператор выполняется до тех пор, пока
выражение имеет значение «истина»
Оператор выполняется как минимум один раз.
Никаких дополнительных ограничений не предусмотрено
Слайд 23Операторы прерывания
break [label];
Прерывает выполнение блока
При указании метки – после прерывания
блока управление передается блоку или оператору с данной меткой
continue [label];
Прерывает выполнение текущей итерации цикла
return [expression];
Прерывает выполнение метода
Тип выражения должен совпадать с типом возвращаемого значения
Слайд 24Операторы прерывания
for(int j=0;j
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) 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
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] 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Места возникновения ошибок
Метод
Управление передается в место, откуда метод был вызван
Конструктор
Управление передается
в место создания экземпляра объекта
Статический инициализатор
Управление передается в место первого обращения к классу
Слайд 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");
}
}
Слайд 41public 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");
}
}
Слайд 42public 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");
}
}
Слайд 44import 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!");
}
}
}
}
Слайд 45public 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
При возникновении исключения производится поиск соответствующего catch
Исключение –
класс, реализующий интерфейс Throwable
Соответствующий catch – catch, в котором указано само исключение или его предок
Блоки catch проверяются последовательно
После нахождения нужного catch другие не проверяются
Блок finally выполняется в любом случае
Слайд 47Когда ошибка не обрабатывается
Нет подходящего catch
Блок finally выполняется, ошибка передается выше
Ошибка
внутри блока catch
Блок finally выполняется, ошибка передается выше
Ошибка внутри блока finally
ошибка передается выше
Слайд 48Самостоятельный вызов Exception
throw new Exception(“Exception”);
Аналогично возникновению ошибки в данном месте программы
В
качестве аргумента получает экземпляр (объект) ? необходима инициализация
Может использоваться в обработчиках ошибок: обрабатываем, а затем «пробрасываем» дальше.
Слайд 49public 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
Программными средствами ошибку обработать невозможно
Слайд 52Самостоятельное определение исключений
Создается класс – наследник Throwable или
Exception;
RuntimeException;
любого другого класса в
иерархии Exception
В нужной ситуации
Создается экземпляр класса;
Его поля наполняются необходимой информацией;
Объект отправляется на обработку с помощью throw
Слайд 53public 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";
} }
Слайд 54public 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Содержание
Блоки
Циклы
Логические операторы
Массивы
Исключения