000367: Неверный тип данных для геообработки.
Заданный тип входных данных относится к другому типу данных, чем тот, который необходим для данного параметра.
Для входных параметров необходим определенный тип входных данных. Например, если растр является ожидаемым для входного параметра, Вы не можете использовать входные данные типа Date. В общем, диалоги инструмента не позволят Вам указать несовместимый тип данных. Иногда инструмент может даже автоматически исправлять входные данные. Например, в случае ввода значения с плавающей точкой там, где требуется целочисленное значение, входное значение будет усечено до целочисленного. Эта проблема может появляться при использовании по невнимательности переменных моделей для параметров, которые не соответствуют требуемым типам.
Решение
Просмотрите использование для инструмента и убедитесь, что все параметры входных данных имеют корректный тип.
Введение в использование типов данных и свойств полей
Каждая таблица в Access состоит из полей. В свойствах поля описываются характеристики и поведение добавляемых в него данных. Тип данных поля — это самое важное свойство, которое определяет, какие данные могут храниться в поле. В этой статье описаны типы данных и другие свойства поля, доступные в Access, а также приведена дополнительная информация в разделе справочных сведений о типах данных.
В этой статье
- Общие сведения
- Когда какой тип данных использовать?
- Свойство «Размер поля»
- Типы данных в связях и соединениях
- Справочные сведения о типах данных
Общие сведения
Иногда типы данных могут показаться неочевидными, например в поле с типом данных «Текст» могут храниться данные, состоящие из текста и чисел. Но в поле с типом данных «Число» могут храниться только числовые данные. Поэтому вам нужно знать, какие свойства используются для каждого типа данных.
Тип данных поля определяет много других важных характеристик поля, в частности:
- форматы, которые можно использовать в поле;
- максимальный размер значения в поле;
- способ использования поля в выражениях;
- возможность индексирования поля.
В зависимости от способа создания нового поля тип данных поля может быть задан заранее или его можно выбрать. Например, если при создании поля в режиме таблицы вы:
- используете существующее поле из другой таблицы, типы данных уже определены в ней или в шаблоне;
- вводите данные в пустом столбце (или поле), Access назначает полю тип данных, исходя из вводимых значений, или вы можете назначить тип данных и формат для поля;
- на вкладке Изменение полей в группе Поля и столбцы выбираете команду Добавить поля, Access отображает список типов данных для выбора.
Когда какой тип данных использовать?
Тип данных поля можно посметь набором характеристик, которые применяются ко всем значениям в нем. Например, значения, хранимые в текстовом поле, могут содержать только буквы, цифры и ограниченный набор знаков препинания, а текстовое поле может содержать не более 255 символов.
Совет: Иногда все выглядит так, как будто данные в поле имеют один тип, а на самом деле это данные другого типа. Например, поле вроде бы содержит числовые значения, но на самом деле это текстовые значения, представляющие номера комнат. Часто для сравнения или преобразования значений с разными типами данных используются выражения.
В таблицах ниже показаны форматы, доступные для каждого типа данных, и описаны результаты форматирования.
Основные типы
Отображаемые данные
Короткие буквенно-цифровые значения, например фамилия или почтовый адрес. Помните, что начиная с версии Access 2013, текстовый тип данных переименован в Краткий текст.
Числовой, Большое число
Числовые значения, например расстояния. Помните, что для денежных значений есть отдельный тип данных.
Значения «Да» и «Нет», а также поля, содержащие только одно из двух значений.
Date/Time, Date/Time Extended
Дата и время: значения даты и времени для лет от 100 до 9999.
Date/Time Extended: значения даты и времени для лет с 1 по 9999.
Форматированный текст
Текст или сочетание текста и чисел, которые отформатированы с помощью элементов управления цветом и шрифтом.
Вычисляемое поле
Результаты вычисления. Вычисление может ссылаться на другие поля в той же таблице. Вычисления создаются с помощью построителя выражений. Вычисляемые поля впервые появились в Access 2010.
Вложенные изображения, файлы электронных таблиц, документы, диаграммы и другие файлы поддерживаемых типов в записях базы данных (как и в сообщениях электронной почты).
Гиперссылка
Текст или сочетание текста и чисел, сохраненное как текст и используемое в качестве адреса гиперссылки.
Длинные блоки текста. Типичный пример использования поля MEMO — подробное описание продукта. Помните, что начиная с версии Access 2013, тип данных MEMO переименован в «Длинный текст».
Подстановка
Список значений, которые получены из таблицы или запроса, или набор значений, которые вы указали при создании поля. Запускается мастер подстановок, с помощью которого можно создать поле подстановки. В зависимости от выбора, сделанного в мастере, данные в поле подстановки могут иметь текстовый или числовой тип.
У полей подстановки есть дополнительный набор свойств, которые находятся на вкладке Подстановка в области Свойства поля.
Примечание: В файлах формата MDB недоступны вложения и вычисляемые данные.
Числовой
Отображаемые данные
Числа без дополнительного форматирования (точно в том виде, в котором хранятся).
Обычные денежные значения.
Обычные денежные значения в формате ЕС.
Фиксированный
Стандартный
Числовые данные с десятичными знаками.
Значения в процентах.
Экспоненциальный
Дата и время
Отображаемые данные
Краткий формат даты
Дата в кратком формате. Зависит от региональных параметров даты и времени. Например, 14.03.2001 для России.
Средний формат даты
Дата в среднем формате. Например, 03-апр-09 для России.
Длинный формат даты
Дата в длинном формате. Зависит от региональных параметров даты и времени. Например, 14 марта 2001 г. для России.
Время (12 часов)
Время только в 12-часовом формате, который будет соответствовать изменениям в региональных параметрах даты и времени.
Средний формат времени
Время в 12-часовом формате, после которого указываются символы AM (до полудня) или PM (после полудня).
Время (24 часа)
Время только в 24-часовом формате, который будет соответствовать изменениям в региональных параметрах даты и времени.
Логический
Отображаемые данные
«Истина» или «Ложь».
Включено/Выключено
Объект OLE Объекты OLE, например документы Word.
Свойство «Размер поля»
После создания поля и указания типа данных для него можно настроить дополнительные свойства поля. Набор доступных дополнительных свойств зависит от типа данных поля. Например, вы можете настроить размер текстового поля с помощью свойства Размер поля.
Для числовых и денежных полей свойство Размер поля особенно важно, поскольку определяет диапазон значений поля. Например, одноразрядное числовое поле может содержать только целые числа в диапазоне от 0 до 255.
Свойство Размер поля определяет также, сколько места на диске занимает каждое значение числового поля. В зависимости от размера поля число может занимать 1, 2, 4, 8, 12 или 16 байт.
Примечание: В полях MEMO и текстовых полях возможны значения переменных размеров. Для этих типов данных свойство Размер поля задает максимальный размер доступного пространства для одного значения.
Дополнительные сведения о свойствах полей и той роли, которую они выполняют для различных типов данных, см. в разделе Справочные сведения о типах данных. Ознакомьтесь также со статьей Задание размера поля.
Типы данных в связях и соединениях
Связь между таблицами — это связи между общими полями в двух таблицах. Связь может быть одного из следующих типов: один к одному, один ко многим, многие ко многим.
Объединение — это операция SQL, которая объединяет данные из двух источников в одну запись в запросе набор записей на основе значений в указанном поле, которые имеются в общих источниках. Присоединиться может быть внутреннее соединение, левое внешнее соединение или правое внешнее соединение.
Когда вы создаете связь между таблицами или добавляете соединение в запрос, типы данных в соединяемых полях должны быть одинаковые или совместимые. Например, вы не сможете создать соединение между числовым и текстовым полями, даже если значения в этих полях совпадают.
При использовании связи или соединения поля с типом данных «Счетчик» совместимы с полями числового типа, если для свойства Размер поля последних задано значение Длинное целое.
Для поля, участвующего в связи между таблицами, нельзя изменить тип данных или свойство Размер поля. Чтобы изменить свойство Размер поля, временно удалите связь. Но после изменения типа данных вы не сможете снова создать связь, пока не измените тип данных связанного поля. Дополнительные сведения о таблицах см. в статье Общие сведения о таблицах.
Справочные сведения о типах данных
Тип данных, применяемый к полю, содержит набор свойств, которые вы можете выбрать. Чтобы получить дополнительные сведения, щелкните типы данных ниже.
Вложение
Назначение. Используется в поле, которое позволяет вкладывать файлы и изображения в запись. Например, если у вас есть база данных рабочих контактов, вы можете с помощью поля вложения прикрепить резюме или фотографии контактов. Для файлов некоторых типов Access сжимает добавляемые вложения. Тип данных «Вложение» доступен только в базах данных формата ACCDB.
Типы вложений, сжимаемых в приложении Access
При вложении в базу данных файла любого из указанных ниже типов приложение Access сжимает его.
- Точечные рисунки, например BMP-файлы
- Метафайлы Windows, включая EMF-файлы
- Файлы формата EXIF
- Значки
- Файлы формата TIFF
В запись можно вложены файлы разных типов. Однако некоторые типы файлов, которые могут представлять угрозу безопасности, блокируются. Как правило, можно вложите любой файл, созданный в одной из Microsoft Office программ. Кроме того, можно вкладывать файлы журнала (LOG), текстовые файлы (TEXT, TXT) и сжатые ZIP-файлы. Список поддерживаемых форматов файлов изображений см. в таблице далее в этом разделе.
Список блокируемых типов файлов
Access блокирует вложенные файлы следующих типов:
Указание типов данных с помощью Мастера выбора данных


Для преобразования в тип данных Excel ищет совпадение между значениями ячеек и поставщиком базы данных. Если совпадение найдено, в ячейке будет отображаться значок типа данных, указывающий на то, что преобразование выполнено успешно. Если вместо него вы видите и открывается мастер выбора данных, Excel требуется ваша помощь в выборе правильного типа данных или в поиске совпадения.
Совет: В Excel в Интернете можно выбрать вкладку «Тип данных»
или «Справка»
в правой части экрана для перехода между панелями.
Попробуйте!
- Если вы пытаетесь выполнить преобразование в тип данных и в ячейке появляется вопросительный знак вместо значка типа данных, результат нужно уточнить или сопоставить в мастере выбора данных. Если мастер выбора данных не открывается автоматически, вы можете открыть его, щелкнув вопросительный знак в ячейке.
- В мастере выбора данных просмотрите результаты и выберите нужный вам. Мастер выбора данных перейдет к следующему результату, который требуется определить.
Примечание: Нужна помощь в указании или получении правильных результатов? См. раздел об уточнении результатов ниже.
Распространенные вопросы о мастере выбора данных
Как уточнить результаты, чтобы получить правильный тип данных?
Если вы выбрали вариант Автоматически для преобразования текста в тип данных, Excel выполняет преобразование в тип данных, который является наиболее вероятным результатом, или отображает результаты в мастере выбора данных, которые кажутся наиболее вероятными. Но если выбран неправильный вариант, вы можете легко изменить или указать нужный тип данных.
Примечание: Например, термин «Бразилия», скорее всего, будет преобразован в страну, но при выборе типа данных «Фильмы» или при поиске «Бразилия фильм» в мастере выбора данных отображаются результаты для фильма «Бразилия».
Попробуйте выполнить любое из этих действий, чтобы получить правильный тип данных:
- Выделите ячейку, которую нужно изменить, перейдите в раздел Данные и выберите нужный тип данных в коллекции Типы данныхна ленте.
- Уточните термины (если возможно) в мастере выбора данных или путем ввода в ячейку. Например, введите «яблоки «Антоновка»» вместо «Антоновка».
Примечание: Если текст был преобразован в неправильный тип данных, вы также можете щелкнуть правой кнопкой мыши ячейку, нажать Типы данных > Изменить. и выбрать другой результат или уточнить термин в мастере выбора данных.
Что делать, если нет нужных мне результатов?
Если мастер выбора данных открыт, но результатов нет, попробуйте выполнить указанные ниже действия.
- Убедитесь, что ваш текст написан правильно и что каждый уникальный термин находится в своей ячейке.
- Попробуйте использовать похожие термины и альтернативы. Например, используйте слово «мост» вместо «эстакада».
- Уточните термины (если возможно) в мастере выбора данных или путем ввода в ячейку. Например, введите «яблоки «Антоновка»» вместо «Антоновка».
Если все еще не удается найти результаты, см. раздел Какие типы связанных данных доступны, чтобы увидеть, поддерживается ли эта тема. В случае термина, для которого нет совпадающих результатов, вы можете вручную добавить данные в строку или удалить ее.
Что делать, если есть несколько результатов с одинаковым именем?
Это может произойти с определенными типами данных, например с типом данных Еда. Вы можете:
- Уточнить результаты путем ввода более конкретного термина в текстовое поле мастера выбора данных.
- Выбрать изображение результата, чтобы открыть подробное представление, а затем использовать эти сведения для осуществления информированного выбора.
Обработка ошибок и исключения
2. Коды возврата. Основная идея — в случае ошибки возвращать специальное значение, которое не может быть корректным. Например, если в методе есть операция деления, то придется проверять делитель на равенство нулю. Также проверим корректность аргументов a и b :
Double f(Double a, Double b) < if ((a == null) || (b == null)) < return null; > //. if (Math.abs(b) < EPS) < return null; > else < return a / b; > >
При вызове метода необходимо проверить возвращаемое значение:
Double d = f(a, b); if (d != null) < //. > else < //. >
Минусом такого подхода является необходимость проверки возвращаемого значения каждый раз при вызове метода. Кроме того, не всегда возможно определить тип ошибки.
3.Использовать флаг ошибки: при возникновении ошибки устанавливать флаг в соответствующее значение:
boolean error; Double f(Double a, Double b) < if ((a == null) || (b == null)) < error = true; return null; > //. if (Math.abs(b) < EPS) < error = true; return b; > else < return a / b; > >
error = false; Double d = f(a, b); if (error) < //. > else < //. >
Минусы такого подхода аналогичны минусам использования кодов возврата.
4.Можно вызвать метод обработки ошибки и возвращать то, что вернет этот метод.
Double f(Double a, Double b) < if ((a == null) || (b == null)) < return nullPointer(); > //. if (Math.abs(b) < EPS) < return divisionByZero(); > else < return a / b; > >
Но в таком случае не всегда возможно проверить корректность результата вызова основного метода.
5.В случае ошибки просто закрыть программу.
if (Math.abs(b) < EPS) < System.exit(0); return this; >
Это приведет к потере данных, также невозможно понять, в каком месте возникла ошибка.
Исключения
В Java возможна обработка ошибок с помощью исключений:
Double f(Double a, Double b) < if ((a == null) || (b == null)) < throw new IllegalArgumentException("arguments of f() are null"); > //. return a / b; >
Проверять b на равенство нулю уже нет необходимости, так как при делении на ноль метод бросит непроверяемое исключение ArithmeticException .
- разделить обработку ошибок и сам алгоритм;
- не загромождать код проверками возвращаемых значений;
- обрабатывать ошибки на верхних уровнях, если на текущем уровне не хватает данных для обработки. Например, при написании универсального метода чтения из файла невозможно заранее предусмотреть реакцию на ошибку, так как эта реакция зависит от использующей метод программы;
- классифицировать типы ошибок, обрабатывать похожие исключения одинаково, сопоставлять специфичным исключениям определенные обработчики.
Каждый раз, когда при выполнении программы происходит ошибка, создается объект-исключение, содержащий информацию об ошибке, включая её тип и состояние программы на момент возникновения ошибки. После создания исключения среда выполнения пытается найти в стеке вызовов метод, который содержит код, обрабатывающий это исключение. Поиск начинается с метода, в котором произошла ошибка, и проходит через стек в обратном порядке вызова методов. Если не было найдено ни одного подходящего обработчика, выполнение программы завершается.
Таким образом, механизм обработки исключений содержит следующие операции:
- Создание объекта-исключения.
- Заполнение stack trace’а этого исключения.
- Stack unwinding (раскрутка стека) в поисках нужного обработчика.
Классификация исключений
Класс Java Throwable описывает все, что может быть брошено как исключение. Наследеники Throwable — Exception и Error — основные типы исключений. Также RuntimeException , унаследованный от Exception , является существенным классом.
![]()
Иерархия стандартных исключений
Проверяемые исключения
Наследники класса Exception (кроме наслеников RuntimeException ) являются проверяемыми исключениями(checked exception). Как правило, это ошибки, возникшие по вине внешних обстоятельств или пользователя приложения – неправильно указали имя файла, например. Эти исключения должны обрабатываться в ходе работы программы, поэтому компилятор проверяет наличие обработчика или явного описания тех типов исключений, которые могут быть сгенерированы некоторым методом.
Все исключения, кроме классов Error и RuntimeException и их наследников, являются проверяемыми.
Error
Класс Error и его подклассы предназначены для системных ошибок. Свои собственные классы-наследники для Error писать (за очень редкими исключениями) не нужно. Как правило, это действительно фатальные ошибки, пытаться обработать которые довольно бессмысленно (например OutOfMemoryError ).
RuntimeException
Эти исключения обычно возникают в результате ошибок программирования, такие как ошибки разработчика или неверное использование интерфейса приложения. Например, в случае выхода за границы массива метод бросит OutOfBoundsException . Такие ошибки могут быть в любом месте программы, поэтому компилятор не требует указывать runtime исключения в объявлении метода. Теоретически приложение может поймать это исключение, но разумнее исправить ошибку.
Обработка исключений
Чтобы сгенерировать исключение используется ключевое слово throw . Как и любой объект в Java, исключения создаются с помощью new .
if (t == null) < throw new NullPointerException("t = null"); >
Есть два стандартных конструктора для всех исключений: первый — конструктор по умолчанию, второй принимает строковый аргумент, поэтому можно поместить подходящую информацию в исключение.
Возможна ситуация, когда одно исключение становится причиной другого. Для этого существует механизм exception chaining. Практически у каждого класса исключения есть конструктор, принимающий в качестве параметра Throwable – причину исключительной ситуации. Если же такого конструктора нет, то у Throwable есть метод initCause(Throwable) , который можно вызвать один раз, и передать ему исключение-причину.
Как и было сказано раньше, определение метода должно содержать список всех проверяемых исключений, которые метод может бросить. Также можно написать более общий класс, среди наследников которого есть эти исключения.
void f() throws InterruptedException, IOException < //.
try-catch-finally
Код, который может бросить исключения оборачивается в try -блок, после которого идут блоки catch и finally (Один из них может быть опущен).
try < // Код, который может сгенерировать исключение >
Сразу после блока проверки следуют обработчики исключений, которые объявляются ключевым словом catch.
try < // Код, который может сгенерировать исключение > catch(Type1 id1) < // Обработка исключения Type1 > catch(Type2 id2) < // Обработка исключения Type2 >
Сatch -блоки обрабатывают исключения, указанные в качестве аргумента. Тип аргумента должен быть классом, унаследованного от Throwable , или самим Throwable . Блок catch выполняется, если тип брошенного исключения является наследником типа аргумента и если это исключение не было обработано предыдущими блоками.
Код из блока finally выполнится в любом случае: при нормальном выходе из try , после обработки исключения или при выходе по команде return .
NB: Если JVM выйдет во время выполнения кода из try или catch , то finally -блок может не выполниться. Также, например, если поток выполняющий try или catch код остановлен, то блок finally может не выполниться, даже если приложение продолжает работать.
Блок finally удобен для закрытия файлов и освобождения любых других ресурсов. Код в блоке finally должен быть максимально простым. Если внутри блока finally будет брошено какое-либо исключение или просто встретится оператор return , брошенное в блоке try исключение (если таковое было брошено) будет забыто.
import java.io.IOException; public class ExceptionTest < public static void main(String[] args) < try < try < throw new Exception("a"); > finally < throw new IOException("b"); > > catch (IOException ex) < System.err.println(ex.getMessage()); > catch (Exception ex) < System.err.println(ex.getMessage()); > > >
После того, как было брошено первое исключение — new Exception(«a») — будет выполнен блок finally , в котором будет брошено исключение new IOException(«b») , именно оно будет поймано и обработано. Результатом его выполнения будет вывод в консоль b . Исходное исключение теряется.
Обработка исключений, вызвавших завершение потока
При использовании нескольких потоков бывают ситуации, когда поток завершается из-за исключения. Для того, чтобы определить с каким именно, начиная с версии Java 5 существует интерфейс Thread.UncaughtExceptionHandler . Его реализацию можно установить нужному потоку с помощью метода setUncaughtExceptionHandler . Можно также установить обработчик по умолчанию с помощью статического метода Thread.setDefaultUncaughtExceptionHandler .
Интерфейс Thread.UncaughtExceptionHandler имеет единственный метод uncaughtException(Thread t, Throwable e) , в который передается экземпляр потока, завершившегося исключением, и экземпляр самого исключения. Когда поток завершается из-за непойманного исключения, JVM запрашивает у потока UncaughtExceptionHandler , используя метод Thread.getUncaughtExceptionHandler() , и вызвает метод обработчика – uncaughtException(Thread t, Throwable e) . Все исключения, брошенные этим методом, игнорируются JVM.
Информация об исключениях
- getMessage() . Этот метод возвращает строку, которая была первым параметром при создании исключения;
- getCause() возвращает исключение, которое стало причиной текущего исключения;
- printStackTrace() печатает stack trace, который содержит информацию, с помощью которой можно определить причину исключения и место, где оно было брошено.
Exception in thread "main" java.lang.IllegalStateException: A book has a null property at com.example.myproject.Author.getBookIds(Author.java:38) at com.example.myproject.Bootstrap.main(Bootstrap.java:14) Caused by: java.lang.NullPointerException at com.example.myproject.Book.getId(Book.java:22) at com.example.myproject.Author.getBookIds(Author.java:35)
Все методы выводятся в обратном порядке вызовов. В примере исключение IllegalStateException было брошено в методе getBookIds , который был вызван в main . «Caused by» означает, что исключение NullPointerException является причиной IllegalStateException .
Разработка исключений
Чтобы определить собственное проверяемое исключение, необходимо создать наследника класса java.lang.Exception . Желательно, чтобы у исключения был конструкор, которому можно передать сообщение:
public class FooException extends Exception < public FooException() < super(); > public FooException(String message) < super(message); > public FooException(String message, Throwable cause) < super(message, cause); > public FooException(Throwable cause) < super(cause); > >
Исключения в Java7
- обработка нескольких типов исключений в одном catch -блоке:
catch (IOException | SQLException ex)
В таких случаях параметры неявно являются final , поэтому нельзя присвоить им другое значение в блоке catch .
Байт-код, сгенерированный компиляцией такого catch -блока будет короче, чем код нескольких catch -блоков.
- Try с ресурсами позволяет прямо в try -блоке объявлять необходимые ресурсы, которые по завершению блока будут корректно закрыты (с помощью метода close() ). Любой объект реализующий java.lang.AutoCloseable может быть использован как ресурс.
static String readFirstLineFromFile(String path) throws IOException < try (BufferedReader br = new BufferedReader(new FileReader(path))) < return br.readLine(); > >
В приведенном примере в качестве ресурса использутся объект класса BufferedReader , который будет закрыт вне зависимосити от того, как выполнится try -блок.
Можно объявлять несколько ресурсов, разделяя их точкой с запятой:
public static void viewTable(Connection con) throws SQLException < String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES"; try (Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query)) < //Work with Statement and ResultSet > catch (SQLException e) < e.printStackTrace; >>
Во время закрытия ресурсов тоже может быть брошено исключение. В try-with-resources добавленна возможность хранения «подавленных» исключений, и брошенное try -блоком исключение имеет больший приоритет, чем исключения получившиеся во время закрытия. Получить последние можно вызовом метода getSuppressed() от исключения брошенного try -блоком.
- Перебрасывание исключений с улучшенной проверкой соответствия типов.
Компилятор Java SE 7 тщательнее анализирует перебрасываемые исключения. Рассмотрим следующий пример:
static class FirstException extends Exception < >static class SecondException extends Exception < >public void rethrowException(String exceptionName) throws Exception < try < if ("First".equals(exceptionName)) < throw new FirstException(); > else < throw new SecondException(); > > catch (Exception ex) < throw e; > >
В примере try -блок может бросить либо FirstException , либо SecondException . В версиях до Java SE 7 невозможно указать эти исключения в декларации метода, потому что catch -блок перебрасывает исключение ex , тип которого — Exception .
В Java SE 7 вы можете указать, что метод rethrowException бросает только FirstException и SecondException . Компилятор определит, что исключение Exception ex могло возникнуть только в try -блоке, в котором может быть брошено FirstException или SecondException . Даже если тип параметра catch — Exception , компилятор определит, что это экземпляр либо FirstException , либо SecondException :
public void rethrowException(String exceptionName) throws FirstException, SecondException < try < // . > catch (Exception e) < throw e; > >
Если FirstException и SecondException не являются наследниками Exception , то необходимо указать и Exception в объявлении метода.
Примеры исключений
- любая операция может бросить VirtualMachineError . Как правило это происходит в результате системных сбоев.
- OutOfMemoryError . Приложение может бросить это исключение, если, например, не хватает места в куче, или не хватает памяти для того, чтобы создать стек нового потока.
- IllegalArgumentException используется для того, чтобы избежать передачи некорректных значений аргументов. Например:
public void f(Object a) < if (a == null) < throw new IllegalArgumentException("a must not be null"); > >
- IllegalStateException возникает в результате некорректного состояния объекта. Например, использование объекта перед тем как он будет инициализирован.
Гарантии безопасности
При возникновении исключительной ситуации, состояния объектов и программы могут удовлетворять некоторым условиям, которые определяются различными типами гарантий безопасности:
- Отсутствие гарантий (no exceptional safety). Если было брошено исключение, то не гарантируется, что все ресурсы будут корректно закрыты и что объекты, методы которых бросили исключения, могут в дальнейшем использоваться. Пользователю придется пересоздавать все необходимые объекты и он не может быть уверен в том, что может переиспозовать те же самые ресурсы.
- Отсутствие утечек (no-leak guarantee). Объект, даже если какой-нибудь его метод бросает исключение, освобождает все ресурсы или предоставляет способ сделать это.
- Слабые гарантии (weak exceptional safety). Если объект бросил исключение, то он находится в корректном состоянии, и все инварианты сохранены. Рассмотрим пример:
class Interval < //invariant: left double left; double right; //. >
Если будет брошено исключение в этом классе, то тогда гарантируется, что ивариант «левая граница интервала меньше правой» сохранится, но значения left и right могли измениться.
- Сильные гарантии (strong exceptional safety). Если при выполнении операции возникает исключение, то это не должно оказать какого-либо влияния на состояние приложения. Состояние объектов должно быть таким же как и до вызовов методов.
- Гарантия отсутствия исключений (no throw guarantee). Ни при каких обстоятельствах метод не должен генерировать исключения. В Java это невозможно, например, из-за того, что VirtualMachineError может произойти в любом месте, и это никак не зависит от кода. Кроме того, эту гарантию практически невозможно обеспечить в общем случае.
Источники
- Обработка ошибок и исключения — Сайт Георгия Корнеева
- Лекция Георгия Корнеева — Лекториум
- The Java Tutorials. Lesson: Exceptions
- Обработка исключений — Википедия
- Throwable (Java Platform SE 7 ) — Oracle Documentation
- try/catch/finally и исключения — www.skipy.ru