
- •JAVA-ТЕХНОЛОГИЯ
- •Блоки и объявления локальных переменных
- •Условный оператор и условное выражение
- •Оператор switch
- •Операторы while и do-while
- •Операторы for, break, continue
- •Исключения (exceptions)
- •Исключения в Java
- •Рекомендации по проектированию исключений
- •Определение (классов) исключений
- •Неконтролируемые исключения
- •Обработка исключений: оператор try/catch/finally
- •Примеры использования исключений
- •Дополнительные возможности класса Exception
- •Assertions (предположения)

JAVA-ТЕХНОЛОГИЯ
Сафонов Владимир Олегович
Профессор кафедры информатики, руководитель лаборатории Java- технологии (http://polyhimnie.math.spbu.ru/jtl)
Email: vosafonov@gmail.com
Лекция 5

Блоки и объявления локальных переменных
Блок: {S1; S2; … Sn} , где Si – оператор или объявление локальной переменной
Область действия локального объявления – от объявления до конца блока (а не весь блок) :
{int a = 1; int b = 2; int c; c = a + b; } // корректно
{int x = y + 1; // ошибка: y определяется позже x
int y = 0; int z = z;
// ошибка : использование z в правой части его определения
}
Для совместимости с C / C++ разрешается использовать две формы объявления переменных типа “массив”:
double[][] a ; // рекомендуется
double a [][]; // допустимо для совместимости с C / C++ double[] a []; // и т.д. – допустимо, но не рекомендуется
void m(int x) { int x; /* ошибка: аргументы и локальные – один блок */ }
(C) В.О. Сафонов. 2013

Условный оператор и условное выражение
|
Условный оператор: |
if (B) S |
или if(B) S else S1 |
|
Пример (с рекомендуемой расстановкой скобок) : |
||
|
if (i < 0 || i > a.length) { |
|
|
|
y = 0; |
|
|
|
} else { |
|
|
|
y = a[i]; |
|
|
|
} |
|
|
|
Условное выражение: |
B? E1 : E2 |
|
|
Пример: |
|
|
|
y = (i < 0 || i >= a.length)? 0 |
: a[i]; |
(C) В.О. Сафонов. 2013

Оператор switch
switch (token) { // допустимо выражение типа char, byte, short, int
case ID: // допустимо несколько меток: case C1: case C2: AssignmentOrCallStatement();
break; // при отсутствии – “проваливание” в другую альтернативу
case IF:
IfStatement(); break; case BEGIN:
BlockStatement(); break;
default: // альтернатива default настоятельно рекомендуется Error(); // одно из типичных применений default
} // switch
Спецификация Java рекомендует Java-компиляторам выдавать предупреждение, если в switch нет default-альтернативы
(C) В.О. Сафонов. 2013

Операторы while и do-while
Пример 1: метод итераций
while (Math.abs(cur – prev) >= EPS) { // выражение типа boolean double tmp = cur;
cur = F(cur); prev = tmp;
} // while
Пример 2: поиск элемента в списке found: // помеченный оператор do-while
do {
if (elem.getValue() == x) { break found;
} else {
elem = elem.getNext();
}
} while (elem != null); // в скобках – выражение типа boolean
(C)В.О. Сафонов.
2013

Операторы for, break, continue
done:
//Суммирование неотрицательных элементов матрицы a.
//Если встречается NaN или Positive/Negative Infinity, выход из цикла for (int i = 0; i < a.length; i++) {
double s = 0.0;
int m = a[i].length;
for (int j = 0; j < m; j++) { double x = a[i][j];
if (Double.isInfinite(x) || Double.isNaN(x)) break done; if (x < 0.0) continue;
s += x;
}
System.out.println(s);
}
(C) В.О. Сафонов. 2013

Исключения (exceptions)
Исключение – способ прекращения выполнения конструкции или метода в случае ошибки, нарушения ограничений или другого отклонения от нормального хода выполнения программы
Исключения - важный элемент модульного программирования (повышают надежность модуля и входят в его интерфейс)
Возможная альтернатива – коды завершения методов (Pascal, C)
История понятия исключения:
- PL/1 (1965) : оператор ON
ON ENDFILE(SYSIN) GOTO ERROR; - CLU (1974): сигналы (signals)
car = proc(p:list) signals empty; … if p = nil then signal empty;
- C++ (в версии 1989 г.): исключения – объекты (структуры) :
(C) В.О. Сафонов.
2013 struct MyExc { …}; …void p() { … if (B) throw MyExc(); … }; try { … p(); … } catch (MyExc e) { … }

Исключения в Java
Исключение – объект класса, производного от Throwable
Иерархия исключений:
-Exception – исключение, которое может быть обработано
- Error – ошибка, приводящая к прекращению программы, например:
NoSuchFieldError – отсутствие поля в классе;
AbstractMethodError – попытка вызова абстрактного метода.
Иерархия обрабатываемых исключений:
- Потомки RuntimeException – “стандартные”
исключения, например:
ArrayIndexOutOfBoundsException – выход за границу массива
(C) -В.Остальные. Сафонов. исключения определяются пользователем:
2013 public class MyException extends Exception { … }; //

Рекомендации по проектированию исключений
Исключение – ошибочная (экстремальная, не планируемая) ситуация, а не условие завершения
конструкции.
Для (планируемого) условия завершения или
прекращения конструкции следует использовать
циклы while, do-while и операторы break с меткой:
while (p != nil)
{process(p); p = p.next()};
// throw new EndOfList() – плохой стиль проектирования
Found:
for (k = 0; k < n; k++)
{ … if Condition(a[k]) break Found; … }
// throw new ElementFound() – плохой стиль
проектирования
int Pop() throws (EmptyStack) // рекомендуется
(C)В.О. Сафонов{ if (sp. < 0) throw new EmptyStack(); … } // 2013рекомендуется

Определение (классов) исключений
Контролируемые исключения (их рекомендуется использовать) :
-должны быть потомками Exception
-могут содержать дополнительную информацию
-должны указываться в заголовке метода: throws MyException
-должны быть обработаны при вызове метода
public class NoElementException extends Exception {
public String key; // значение ключа отсутствующего элемента public NoElementException(String aKey) { key = aKey; }
}
public class Table { …
public Object getElement (String key) throws NoElementException { … throw new NoElementException(key); … } …
(C)} //В.TableО. Сафонов. 2013