К. Арнольд, Д. Гослинг - Язык программирования Java, страница 60
Описание файла
PDF-файл из архива "К. Арнольд, Д. Гослинг - Язык программирования Java", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр PDF-файла онлайн
Текст 60 страницы из PDF
Родной методможет вызываться из программы на Java, но пишется он на “родном” языке — обычно на C или C++.При использовании родных методов о переносимости и надежности программы говорить не приходится. Например, родные методы нельзяприменять в коде, который должен пересылаться по сети и выполняться на другом компьютере (скажем, в аплетах) — его архитектура можетотличаться от вашей, но даже если они и совпадают, удаленный компьютер может попросту не доверять вашей системе настолько, чтобыразрешить запускать у себя откомпилированную программу на C.Сведения, касающиеся написания родных методов, приведены в Приложении A.Содержание | ДалееГлава 7ИСКЛЮЧЕНИЯПлохо подогнанное снаряжение может заставить ваш гранатомет M203 выстрелить в самый неожиданный момент.Подобное происшествие плохо скажется на вашей репутации среди тех, кто останется в живых.Журнал PS армии США,август 1993 годаВо время своей работы приложение иногда сталкивается с разного рода нештатными ситуациями.
При вызове метода некоторого объекта онможет обнаружить у себя внутренние проблемы (неверные значения переменных), найти ошибки в других объектах или данных (например, вфайле или сетевом адресе), определить факт нарушения своего базового контракта (чтение данных из закрытого потока) и так далее.Многие программисты не проверяют все возможные источники ошибок, и на то есть веская причина: если при каждом вызове методаанализировать все мыслимые ошибки, текст программы становится совершенно невразумительным. Таким образом достигается компромиссмежду правильностью (проверка всех ошибок) и ясностью (отказ от загромождения основной логики программы множеством проверок).Исключения предоставляют удобную возможность проверки ошибок без загромождения текста программы. Кроме того, исключениянепосредственно сигнализируют об ошибках, а не меняют значения флагов или каких-либо полей, которые потом нужно проверять.
Исключенияпревращают ошибки, о которых может сигнализировать метод, в явную часть контракта этого метода. Список исключений виден программисту,проверяется компилятором и сохраняется в расширенных классах, переопределяющих данный метод.Исключение возбуждается, когда возникает неожиданное ошибочное состояние.
Затем исключение перехватывается соответствующимусловием в стеке вызова методов. Если исключение не перехвачено, срабатывает обработчик исключения по умолчанию, который обычновыводит полезную информацию об исключении (скажем, содержимое стека вызовов).7.1.
Создание новых типов исключенийИсключения в Java представляют собой объекты. Все типы исключений (то есть все классы, объекты которых возбуждаются в качествеисключений) должны расширять класс языка Java, который называется Throwable, или один из его подклассов. Класс Throwable содержит строку,которая может использоваться для описания исключения.
По соглашению, новые типы исключений расширяют класс Exception, а не Throwable.Исключения Java, главным образом, являются проверяемыми — это означает, что компилятор следит за тем, чтобы ваши методы возбуждалилишь те исключения, о которых объявлено в заголовке метода. Стандартные исключения времени выполнения и ошибки расширяют классыRuntimeException и Error, тем самым создавая непроверяемые исключения.
Все исключения, определяемые программистом, должны расширятькласс Exception, и, таким образом, они являются проверяемыми.Иногда хочется иметь больше данных, описывающих состояние исключения, — одной строки, предоставляемой классом Exception, оказываетсянедостаточно. В таких случаях можно расширить класс Exception и создать на его основе новый класс с дополнительными данными (значениякоторых обычно задаются в конструкторе).Например, предположим, что в интерфейс Attributed, рассмотренный в главе 4, добавился метод replaceValue, который заменяет текущеезначение именованного атрибута новым. Если атрибут с указанным именем не существует, возбуждается исключение — вполне резоннопредположить, что заменить несуществующий атрибут не удастся.
Исключение должно содержать имя атрибута и новое значение, котороепытались ему присвоить. Для работы с таким исключением создается класс NoSuchAttribiteException:public class NoSuchAttributeException extends Exception {public String attrName;public Object newValue;NoSuchAttributeException(String name, Object value) {super("No attribute named \"" + name + "\" found");attrName = name;newValue = value;}}NoSuchAttribiteException расширяет Exception и включает конструктор, которому передается имя атрибута и присваиваемое значение; крометого, добавляются открытые поля для хранения данных. Внутри конструктора вызывается конструктор суперкласса со строкой, описывающейпроисходящее.
Исключения такого рода могут использоваться во фрагменте программы, перехватывающем исключения, поскольку они выводятпонятное человеку описание ошибки и данные, вызвавшие ее. Добавление полезной информации — одна из причин, по которым создаютсяновые исключения.Другая причина для появления новых типов исключений заключается в том, что тип является важной частью данных исключения, посколькуисключения перехватываются по их типу. Из этих соображений исключение NoSuch AttribiteException стоит создать даже в том случае, если вы несобираетесь включать в него новые данные; в этом случае программист, для которого представляет интерес только это исключение, сможетперехватить его отдельно от всех прочих исключений, запускаемых методами интерфейса Attributed или иными методами, применяемыми кдругим объектам в том же фрагменте программы.В общем случае исключения новых типов следует создавать тогда, когда программист хочет обрабатывать ошибки одного типа и пропускатьошибки другого типа.
В этом случае он может воспользоваться новыми исключениями для выполнения нужного фрагмента программы, вместотого чтобы изучать содержимое объекта-исключения и решать, интересует ли его данное исключение или же оно не относится к делу иперехвачено случайно.7.2. Оператор throwИсключения возбуждаются оператором throw, которому в качестве параметра передается объект. Например, вот как выглядит реализацияreplaceValue в классе AttributedImpl из главы 4:public void replaceValue(String name, Object newValue)throws NoSuchAttributeException{Attr attr = find(name);// Искать attrif (attr == null)// Если атрибут не найденthrow new NoSuchAttributeException(name, this);attr.valueOf(newValue);}Метод replaceValue сначала ищет имя атрибута в текущем объекте Attr.
Если атрибут не найден, то возбуждается объект-исключение типа NoSuchAttribiteException и его конструктору предоставляются содержательные данные. Исключения являются объектами, поэтому передиспользованием их необходимо создать. Если атрибут не существует, то его значение заменяется новым.Разумеется, исключение может быть порождено вызовом метода, внутри которого оно возбуждается.7.3. Условие throwsПервое, что бросается в глаза в приведенном выше методе replace Value, — это список проверяемых исключений, которые в нем возбуждаются.
ВJava необходимо перечислить проверяемые исключения, возбуждаемые методом, поскольку программист при вызове метода должен знать их втакой же степени, в какой он представляет себе нормальное поведение метода. Проверяемые исключения, возбуждаемые методом, не уступаютпо своей важности типу возвращаемого значения — и то и другое необходимо объявить.Проверяемые исключения объявляются в условии throws, которое может содержать список значений, отделяемых друг от друга запятыми.Внутри метода разрешается возбуждать исключения, являющиеся расширениями типа Exception в условии throws, поскольку всегда допускаетсяполиморфно использовать класс вместо его суперкласса. Метод может возбуждать несколько различных исключений, являющихсярасширениями одного конкретного класса, и при этом объявить в условии throws всего один суперкласс. Тем не менее, поступая таким образом,вы скрываете от работающих с методом программистов полезную информацию, потому что они не будут знать, какие из возможныхрасширенных типов исключений возбуждаются методом.
В целях надлежащего документирования условие throws должно быть как можно болееполным и подробным.Контракт, определяемый условием throws, обязан неукоснительно соблюдаться — можно возбуждать лишь те исключения, которые указаны вданном условии. Возбуждение любого другого исключения (прямое, с помощью throw, или косвенное, через вызов другого метода) являетсянедопустимым. Отсутствие условия throws не означает, что метод может возбуждать любые исключения; наоборот, оно говорит о том, что он невозбуждает никаких исключений.Все стандартные исключения времени выполнения (такие, как ClassCast Exception и ArithmeticException) представляют собой расширения классаRuntimeException.
О более серьезных ошибках сигнализируют исключения, которые являются расширениями класса Error и могут возникнуть впроизвольный момент в произвольной точке программы. RuntimeException и Error — единственные исключения, которые не нужно перечислятьв условии throws; они являются общепринятыми и могут возбуждаться в любом методе, поэтому компилятор не проверяет их. Полный списокклассов стандартных непроверяемых исключений приведен в Приложении Б.Инициализаторы и блоки статической инициализации не могут возбуждать проверяемые исключения, как прямо, так и посредством вызоваметода, возбуждающего исключение.