Вложенные операторы try Блоки try могут быть вложенными. Внутренние блоки могут содержать или не содержать оператора catch. Если внутренний блок не содержит оператора catch, то объект исключительной ситуации будет передан во внешний блок и обрабатываться оператором catch этого уровня. Пример: Программа принимает из командной строки ряд чисел, находит для них среднее арифметическое, записывает в массив те числа, которые в два или более раз превышают среднее арифметическое. Ожидается, что исключительная ситуация может возникнуть при вычислении среднего арифметического и при записи чисел в массив. class Supplement{ public Supplement(){} public int average(String[] st){ int i,s=0; for (i=0;i=2*sp) arr[j++]=x; } System.out.println(" массив:"); for (i=0;i(throw)->(new)->[класс исключительной ситуации]->(()->())->(;) +--------------- | | ---------------+ Необходимо найти наибольшее и наименьшее числа среди аргументов командной строки. Числа могут быть целого или вещественного типа. Будем считать, что логика решения задачи требует, чтобы чисел было не менее двух, таким образом, мы хотели бы создать исключительную ситуацию, если чисел меньше, чем 2. public class ProgExcept4{ public static void main(String[] args){ int i; double max,min; max=Double.parseDouble(args[0]); min=max; try { if (args.length<2) throw IllegalArgumentException(); for (i=1;imax) max=x; if (xmax) max=x; if (x[модификатор]->[тип возвр. значения]->[имя метода]->(()+>[список аргументов]->({)->(throws)->[имя искл. ситуац.]+>({)->[тело метода]->(})-> ^--------------------+ Аналогичным образом может быть записан конструктор. Необрабатываемые исключения генерируются и обрабатываются автоматически, и для них конструкция throws в заголовке метода не нужна. Если в теле реализуемого метода используется метод, который может возбудить исключительную ситуацию и это исключение не перехватывается, то в заголовке реализующего метода требуется указать тип соответствующего исключения. Если это исключение порождается внутри защищённого блока программного кода и в каком-либо блоке catch перехватывается, то указывать в заголовке тип исключения не следует. public static void main(String[] args) throws IOException{ DataInputStream ds.................. Если в родительском классе задан метод, в заголовке которого задан тип некоторой исключительной ситуации, а в классе-потомке этот метод переопределяется, в переопределяемом методе также требуется указывать совместимый тип исключительной ситуации, то есть должен быть указан тот же тип либо тип исключительной ситуации - потомка от данного типа, в противном случае компилятор выдаёт ошибку. Оператор finally Если генерируется исключительная ситуация, то весь код от оператора, создавшего исключительную ситуацию, до конца блока try не выполняется. Если к моменту возникновения иключительной ситуации были выделены некоторые ресурсы, то они окажутся недоступны в дальнейшем, например, если в начале некоторого метода открывается файл, а затем он должен быть закрыт и этого не произойдёт, то могут возникнуть серьёзные последствия. Для решения подобных проблем используется оператор finally. Блок finally выполняется независимо от того, была сгенерирована исключительная ситуация либо нет, а также от того, была она перехвачена оператором catch либо не была перехвачена. Советы по использованию исключительных ситуаций Практика показывает, что некоторые программисты считают использование исключительных ситуаций как панацею от всех бед и мало уделяют внимание разработке собственных обработчиков ошибок, поэтому полезно следовать перечисленным советам: 1) там, где простая проверка позволяет не обрабатывать исключительную ситуацию, нужно создавать код для проверки; 2) исключительная ситуация не устраняет проблему, а только позволяет корректно выйти из сложной ситуации; 3) если не сделать собственной проверки, то исключительная ситуация может возникать многократно; 4) при возникновении исключительной ситуации придётся пропустить целую группу операторов, решающих определённую задачу, поэтому в блок try следует включать все операторы, объединённые логикой решения некоторой задачи; 5) не следует избавляться от оператора throws, вместо того, чтобы составить список исключительных ситуаций для метода, может появиться соблазн заключить тело метода в блок try без дальнейшей обработки исключительной ситуации; в этом случае компилятор не будет иметь претензий к программе и код будет хорошо работать до возникновения первой же исключительной ситуации, на которую не будет никакой реакции. Введение в графический интерфейс пользователя Первой графической библиотекой для Java была библиотека AWT (Abstract Windows Toolkit). Принцип её организации: графические элементы пользователя создавались в конкретной операционной среде, библиотека готовила для них заготовку. Фирмами Sun и Netscape совместно был разработан набор инструментальных средств Swing. Принцип: элементы интерфейса строятся средствами Java и изображаются в некотором пустом окне. От операционной системы зависит только представление этого окна на экране. В настоящее время используются и та, и другая библиотеки. Обобщённая иерархия классов пользовательского интерфейса +---------------+ |Component | +---------------+ ^ ^ | \ +--------------+ +----------------+ |AWT Components| |Container | +--------------+ +----------------+ +----------------+ |AWT Containers | +----------------+ Компонент - абстрактный класс, обладает свойствами всех компонентов. В общем это некоторый прямоугольник, положение определяется точкой Point(x,y) и классом Dimention; может также быть представлен классом Rectangle. Для него определена видимость, для этого существует методы isVisible; определена доступность, цвета фона и переднего плана, также шрифт. Контейнер - абстрактный класс, наследник компонента. Задача: группировать другие компоненты. Методы относительно компонентов: add - добавить, remove - удалить, removeAll - удалить всё. Компоненты имеют порядковые номера, можно взять компонент getComponent(int x), определить количество компонентов getComponentCount(), ищет компонент, которому принадлежит данная точка findComponent(int x, int y). Класс Frame: служит для создания полнофункциональных окон с полосой заголовка, рамками, кнопками закрытия, минимизации/максимизации. Фрейм, как правило, является главным окном приложения. Класс Panel является суперклассом для новых контейнеров с вложенными компонентами.