9.8. Оператор throws
Если метод способен возбуждать исключения, которые он сам не обрабатывает, он должен объявить о таком поведении, чтобы вызывающие методы могли защитить себя от этих исключений. Для задания списка исключений, которые могут возбуждаться методом, используется оператор throws. Если метод в явном виде (т.е. с помощью оператора throw) возбуждает исключение соответствующего класса, тип класса исключений должен быть указан в операторе throws в объявлении этого метода. С учетом этого наш прежний синтаксис определения метода должен быть расширен следующим образом:
>тип имя_метода(список аргументов) throws список исюпочений {}
Ниже приведен пример программы, в которой метод procedure пытается возбудить исключение, не обеспечивая ни программного кода для его перехвата, ни объявления этого исключения в заголовке метода. Такой программный код не будет оттранслирован.
>class ThrowsDemo1 {
>static void procedure()
{
> System.out.println("inside procedure");
> throw new IllegalAccessException("demo");
>}
>public static void main(String args[]) {
> procedure();
>}
>}
Для того чтобы мы смогли оттранслировать этот пример, нам придется сообщить транслятору, что procedure может возбуждать исключения типа IllegalAccessException и в методе main добавить код для обработки этого типа исключений:
>class ThrowsDemo {
>static void procedure() throws IllegalAccessException
>{
> System.out.println(" inside procedure");
> throw new IllegalAccessException("demo");
>}
>public static void main(String aigs[]) {
>try {
> procedure();
>}
>catch (IllegalAccessException e) {
> System.out.println("caught" + e);
>}
}
>}
Ниже приведен результат выполнения этой программы.
>С:\> java ThrowsDemo
>inside procedure
>caught javaJangIllegalAccessException: demo
9.9. Оператор finally
Иногда требуется гарантировать, что определенный участок кода будет выполняться независимо от того, какие исключения были возбуждены и перехвачены. Для создания такого участка кода используется оператор finally. Даже в тех случаях, когда в методе нет соответствующего возбужденному исключению раздела catch, блок finally будет выполнен до того, как управление перейдет к операторам, следующим за разделом try. У каждого раздела try должен быть, по крайней мере, или один раздел catch, или блок finally. Блок finally очень удобен для закрытия файлов и освобождения любых других ресурсов, захваченных для временного использования в начале выполнения метода. Ниже приведен пример класса с двумя методами, завершение которых происходит по разным причинам, но в обоих перед выходом выполняется код раздела finally.
>class FinallyDemo {
>static void procA() {
>try {
> System.out.println("insideprocA");
> throw new RuntimeException("demo");
>}
>finally {
> System.out.println("procA's finally");
>}
>}
>static void procB() {
>try {
> System.out.println("insideprocB");
> return;
>}
>finally {
> System.out.println("procB's finally");
>}
>}
>public static void main(String args[]) {
>try {
> procA();
>}
>catch (Exception e) {}
>procB();
>}
>}
В этом примере в методе procA из-за возбуждения исключения происходит преждевременный выход из блока try, но при выходе выполняется раздел finally. Другой метод ргосВ завершает работу выполнением стоящего в try- блоке оператора return, но и при этом перед выходом из метода выполняется программный код блока finally. Ниже приведен результат, полученный при выполнении этой программы.
>С:\> java FinallyDemo
>inside procA procA's finally
>inside procB procB's finally
10. МНОГОПОТОЧНОЕ ПРОГРАММИРОВАНИЕ
Параллельное программирование, связанное с использованием легковесных процессов, или подпроцессов (multithreading, light-weight processes) — концептуальная парадигма, в которой вы разделяете свою программу на два или несколько процессов, которые могут исполняться одновременно.
В системах без параллельных подпроцессов используется подход, называемый циклом обработки событий. В этой модели единственный подпроцесс выполняет бесконечный цикл, проверяя и обрабатывая возникающие события. Синхронизация между различными частями программы происходит в единственном цикле обработки событий. Такие среды называют синхронными управляемыми событиями системами. Если вы можете разделить свою задачу на независимо выполняющиеся подпроцессы и можете автоматически переключаться с одного подпроцесса, который ждет наступления события, на другой, которому есть чем заняться, за тот же промежуток времени вы выполните больше работы. Вероятность того, что больше чем одному из подпроцессов одновременно надолго потребуется процессор, мала.