Kwert-soft.ru

IT Софт для ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Java lang runtimeexception что это

Типы исключений RuntimeException и Error

Компьютер лишен возможности говорить эмоционально и истово. Да, разумеется, он служит образцом математически строгого дизайна,

но вот чего ему по-настоящему не хватает,

так это удивленно приподнятых или сердито сдвинутых бровей.

Исполняющая система способна выбрасывать объекты исключений (exceptions) двух основных семейств типов — производных от RuntimeException либо расширяющих класс ошибок Error. Эти исключения, как было определено в главе 8, относятся к категории необъявляемых. Вот как выглядят несколько верхних уровней иерархии типов исключений Java.

Исключения типов Error свидетельствуют о весьма серьезных ошибках, которые не могут быть отловлены (либо допускают такую возможность в редких случаях и с немалым трудом), а их последствия, как правило, не поддаются преодолению. Типы Error не являются наследниками класса RuntimeException, так что если даже вы и вознамеритесь предусмотреть предложения catch для поимки всех исключений Exception или RuntimeException (что зачастую нельзя считать хорошим решением), исключения Error все равно от вас «ускользнут». Предложения finally конструкций try, разумеется, выполняются при возникновении любых исключений — в том числе и Error, — так что программа всегда сможет выполнить некоторый набор необходимых завершающих операций.

С формальной точки зрения вполне допустимо расширять классы RuntimeException или Error с целью создания собственных необъявляемых исключений, т.е. таких исключений, которые могут быть сгенерированы без предварительного объявления их в предложении throws. Вам надлежит знать обэтом шансе по единственной причине — реализовывать его на практике как раз не следует. Предложение throws предназначено именно для того, чтобы облегчить восприятие всех тонкостей метода теми, кто будет им пользоваться. Расширение типов RuntimeException или Error и использование их объектов в методах конкретных классов свидетельствует о неверном понимании механизмов обработки исключений и затрудняет практическое применение методов программистами, которые вправе надеяться на наличие исчерпывающего описания набора возможных исключений в составе предложений throws. Следует избегать подобного подхода даже в том случае, если код, написанный вами, предназначен для личного «употребления». Пройдет всего пару месяцев, и вы сами — а не только сторонние пользователи — не сможете разобраться в таинствах собственного творческого замысла. Итак, к числу способов обеспечения удобочитаемости кода относится следующий — не расширять классы исключений RuntimeException и Error и не применять их объекты непосредственно.

Большинство типов RuntimeException и Error поддерживает, самое меньшее, по два конструктора: первый не предусматривает задания параметров, а второй в качестве параметра принимает объект String с содержательным описанием природы ошибки. Строка описания может быть получена с помощью методов getMessage либо getLocalizedMessage (последний возвращает локализованный вариант строки).

Приложение состоит из двух разделов: в первом перечислены классы семейства RuntimeException, а во втором — Error. Упоминание каждого типа исключения сопровождается описанием его назначения, вероятной причины возникновения и дополнительных конструкторов, если таковые предусмотрены. Если тип не является частью пакета java.lang, мы указываем наименование соответствующего пакета явно. Внимания удостоены только те исключения, которые относятся к пакетам, рассмотренным ранее.

А.1. Классы RuntimeException

ArithmeticException extends RuntimeException

Возникла исключительная ситуация, связанная с ошибкой при выполнении арифметического вычисления (например, с попыткой целочисленного деления на нуль).

ArrayindexOutOfBoundsException extends indexoutofBoundsException

Задано значение индекса массива, не принадлежащее допустимому диапазону. Имеется дополнительный конструктор, принимающий в качестве параметра ошибочное значение индекса и включающий его в текст описательного сообщения.

ArraystoreException extends RuntimeException

Предпринята попытка сохранения в массиве объекта недопустимого типа.

ClassCastException extends RuntimeException

Выполнена неверная операция преобразования типов.

ConcurrentModificationException extends RuntimeException

Осуществлена попытка изменения объекта конкурирующим потоком вычислений (thread) с нарушением контракта класса (тип определен в пакете Java.util).

EmptyStackException extends RuntimeException

Выполнена операция выталкивания (pop) значения из пустого стека. Ти] обладает только конструктором без параметров, поскольку причин; ситуации очевидна без дополнительных разъяснений (тип определен в nai кете Java. util).

IllegalArgumentException extends RuntimeException

Методу передано неверное значение аргумента (например, отрицательное, когда метод предполагает задание положительных значений).

IllegalMonitorStateException extends RuntimeException

Выполнено обращение к методу wait, notifyAll или notify объекта, когдг текущий поток вычислений не обладает блокировкой (lock) этого объекта.

IllegalStateException extends RuntimeException

Предпринята попытка выполнения операции в то время, когда объект не находится в соответствующем состоянии (например, при регистрации или удалении ловушки события закрытия исполняющей системы (shutdown hook) после начала процедуры закрытия).

IllegalThreadStateException extends IllegalArgumentException

Предпринята попытка выполнения операции в то время, когда объект потока вычислений не находится в соответствующем состоянии (например, вызван метод start для потока, который уже приступил к работе).

IndexOutOfBoundsException extends RuntimeException

Задано значение индекса массива или содержимого строки типа String, не принадлежащее допустимому диапазону.

MissingResourceException extends RuntimeException

Не найден требуемый ресурс или пакет ресурсов (resource bundle). Единственный конструктор типа предусматривает задание трех аргументов: строки описательного сообщения, наименования класса ресурсов и объекта ключа, отвечающего отсутствующему ресурсу. Для получения строк наименования класса и ключа применяются методы getClassName и getKey соответственно (тип определен в пакете Java.util).

NegativeArraySizeException extends RuntimeException

Предпринята попытка создания массива с размером, значение которого задано в виде отрицательного числа.

NoSuchElementException extends RuntimeException

Операция поиска элемента в объекте одного из контейнерных классов завершилась неудачей (тип определен в пакете Java.util).

NullPointerException extends RuntimeException

Для доступа к полю или методу была применена ссылка, равная null. Исключение выбрасывается и в той ситуации, когда метод, не допускающий передачи аргумента null, был вызван с заданием значения null. В последнем случае может быть сгенерировано и исключение типа IllegalArgumentException.

NumberFormatException extends illegalArgumentException

Строка, которая, как предполагалось, должна содержать представление числа, не отвечает этому требованию. Исключение выбрасывается такими методами, как, например, Integer.parseint.

Читать еще:  Char array to string java

SecurityException extends RuntimeException

Предпринята попытка выполнения операции, запрещенной системой обеспечения безопасности в соответствии с действующей политикой безопасности.

StringindexOutOfBoundsException extends indexOutOfBounds Exception

Задано значение индекса содержимого строки типа String, не принадлежащее допустимому диапазону. Имеется дополнительный конструктор, принимающий в качестве параметра ошибочное значение индекса и включающий его в текст описательного сообщения.

UndeclaredThrowableException extends RuntimeException

Выбрасывается при обращении к методу целевого объекта посредством объекта рефлективного класса Proxy, если метод invoke объекта invocationHandler генерирует объявляемое исключение, которое не допускает присваивания ни одному из типов исключений, упомянутых в предложении throws метода целевого объекта. Рассматриваемое исключение содержит ссылку на исключение, генерируемое методом invoke, которое может быть получено с помощью метода getundeclaredThrowable. Класс исключений UndeclaredThrowableException поддерживает два конструктора: оба принимают в качестве параметров ссылку на объект Throwable, а один из них, помимо того, строку описания (тип определен в пакете java.lang.reflect).

UnsupportedOperationException extends RuntimeException

Предпринята попытка выполнения операции над объектом, который ее не поддерживает (например, модификации объекта, обозначенного признаком «только для чтения»). Используется также классами коллекций из состава пакета java.util как реакция на вызов методов производного класса, реализация которых не обязательна.

А.2. Классы Error

AbstractMethodError extends incompatibleClassChangeError

Вызван абстрактный метод класса, не содержащий реализации.

В процессе инициализации класса выявлены циклические ссылки.

ClassFormatError extends LinkageError

Загружаемый класс или интерфейс определен в неверном формате.

ExceptionlnlnitializerError extends LinkageError

В процессе инициализации выброшено необрабатываемое исключение (uncaught exception). Имеется дополнительный конструктор, который в качестве параметра принимает объект необрабатываемого исключения (тот может быть получен посредством метода getException) и сохраняет ссылку на него в текущем объекте.

IllegalAccessError extends IncompatibleClassChangeError

Предпринята попытка неразрешенного обращения к полю или методу. Исключение выбрасывается, если версия класса, существующая в период выполнения, запрещает доступ к члену, который был открыт для обращения при компиляции исходного варианта класса.

IncompatibleClassChangeError extends LinkageError

В процессе загрузки класса или интерфейса выявлено изменение, несовместимое с имеющейся информацией об этом типе (например, в период между моментами компиляции и запуска кода на выполнение из состава типа был удален метод, не относящийся к private).

instantiationError extends IncompatibleClassChangeError

Предпринята попытка создания экземпляра интерфейса или абстрактного класса.

internalErrorextends Vi rtualMachineError

Выявлена внутренняя ошибка периода выполнения (исключение относится к разряду тех, которые «не должны возникать никогда»).

LinkageError extends Error

Исключения этого и производных типов свидетельствуют о том, что некоторый класс определенным образом зависит от других классов и условия такой зависимости не удовлетворены.

NoClassDefFoundError extends LinkageError

Определение класса не найдено.

NoSuchFieldError extends IncompatibleClassChangeError

Определение поля в объявлении класса или интерфейса не найдено.

NoSuchMethodError extends IncompatibleClassChangeError

Определение метода в объявлении класса или интерфейса не найдено.

OutOfMemoryError extends virtualMachineError

Виртуальная машина не в состоянии выделить требуемый фрагмент памяти.

StackOverflowError extends vi rtualMachineError

Произошло переполнение стека вызовов (такая ситуация может свидетельствовать о бесконечном рекурсивном цикле в программе).

ThreadDeath extends Error

Объект типа ThreadDeath выбрасывается потоком вычислений при вызове метода thread, stop. Если объект отлавливается, он должен быть выброшен повторно; если же объект не подвергается обработке, он обычно не заявляет о своем существовании. В составе класса имеется только конструктор без параметров, но объекты класса, как правило, никогда не создаются непосредственно.

UnknownError extends vi rtualMachineError

Выявлена серьезная ошибка неизвестного характера.

UnsatisfiedLinkError extends LinkageError

В процессе объектного связывания обнаружена ссылка на метод native, которая осталась неразрешенной ввиду отсутствия соответствующей библиотеки, содержащей определение метода, либо невозможности отыскания такого определения в любых других загруженных библиотеках.

UnsupportedclassversionError extends ClassFormatError

Версия загруженного класса не поддерживается виртуальной машиной.

VerifyError extends LinkageError

В процессе загрузки класс не способен удовлетворить требованиям процедуры верификации. Подобная процедура проверяет, не нарушает ли код, подлежащий загрузке, норм языка.

virtualMachineError extends Error

Обнаружена внутренняя ошибка виртуальной машины либо последняя исчерпала с истемные ресурсы.

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

Правильное использование исключений в Java

Доброго времени суток, уважаемый Хабр.
Я хотел бы рассказать, как правильно нужно использовать исключения в Java. Частично этот материал рассматривается на просторах интернета, а также рассматривается немного в книге J.Bloch Effective Java. Речь пойдет о использовании проверенных и непроверенных (checked/unchecked) исключениях. Статья будет полезна новичкам, т.к. вначале не всегда ясно, как правильно нужно пользоваться исключениями.

Иерархия исключений в Java представлена следующим образом: родительский класс для всех Throwable. От него унаследовано 2 класса: Exception и Error. От класса Exception унаследован еще RuntimeException.
Error – критические ошибки, который могут возникнуть в системе (например, StackOverflowError ). Как правило обрабатывает их система. Если они возникают, то приложение закрывается, так как при данной ситуации работа не может быть продолжена.

Exception – это проверенные исключения. Это значит, что если метод бросает исключение, которое унаследовано от Exception (напр. IOException), то этот метод должен быть обязательно заключен в блок try-catch. Сам метод, который бросает исключение, должен в сигнатуре содержать конструкцию throws. Проверенные (checked) исключения означают, что исключение можно было предвидеть и, соответственно, оно должно быть обработано, работа приложения должна быть продолжена. Пример такого исключения — это попытка создать новый файл, который уже существует (IOException). В данному случае, работа приложения должна быть продолжена и пользователь должен получить уведомление, по какой причине файл не может быть создан.
Например:

Читать еще:  Bytearrayoutputstream java пример

В данном примере можно увидеть, что метод createTempFile может выбрасывать IOException, когда файл не может быть создан. И это исключение должно быть обработано соответственно. Если попытаться вызвать этот метод вне блока try-catch, то компилятор выдаст ошибку и будет предложено 2 варианта исправления: окружить метод блоком try-catch или метод, внутри которого вызывается File.createTempFile, должен выбрасывать исключение IOException (чтобы передать его на верхний уровень для обработки).

RuntimeException – это непроверенные исключения. Они возникают во время выполнения приложения. К таким исключениям относится, например, NullPointerException. Они не требуют обязательного заключения в блок try-catch. Когда RuntimeException возникает, это свидетельствует о ошибке, допущенной программистом (неинициализированный объект, выход за пределы массива и т.д.). Поэтому данное исключение не нужно обрабатывать, а нужно исправлять ошибку в коде, чтобы исключение вновь не возникало.
Ниже приведен пример, как правильно работать с RuntimeException:

В данном примере метод принимает объект класса Rectangle. В описании метода содержится строка @throws, которая описывает исключение, которое может быть выброшено и при каких условиях. Однако, сигнатура метода не содержит конструкции throws. Это значит, что при вызове метода его не нужно оборачивать блоком try-catch. А программист должен не допустить передачи в метод неинициализированного объекта.

Надеюсь, такие небольшие разъяснения могут немного разобраться, когда же нужно обрабатывать исключения, а когда нужно просто исправлять ошибки в коде.

Как исправить ошибку java.lang.nullpointerexception?

В этом посте я покажу наглядный пример того, как исправить ошибку исключения Null Pointer (java.lang.nullpointerexception). В Java особое значение null может быть назначено для ссылки на объект и означает, что объект в данный момент указывает неизвестную область данных.

NullPointerException появляется, если программа обращается или получает доступ к объекту, а ссылка на него равна нулю (null).

Это исключение возникает следующих случаях:

  • Вызов метода из объекта значения null.
  • Доступ или изменение объекта поля null.
  • Принимает длину null(если бы это был массив Java).
  • Доступ или изменение ячеек объекта null.
  • Показывает «0», значение Throwable.
  • При попытке синхронизации по нулевому объекту.

NullPointerException является RuntimeException, и, таким образом, компилятор Javac не заставляет вас использовать блок try-catch для соответствующей обработки.

Зачем нам нужно значение null?

Как уже упоминалось, null — это специальное значение, используемое в Java. Это чрезвычайно полезно при кодировании некоторых шаблонов проектирования, таких как Null Object pattern и шаблон Singleton pattern.

Шаблон Singleton обеспечивает создание только одного экземпляра класса, а также направлен на предоставление глобального доступа к объекту.

Например, простой способ создания не более одного экземпляра класса — объявить все его конструкторы как частные, а затем создать открытый метод, который возвращает уникальный экземпляр класса:

В этом примере мы объявляем статический экземпляр класса Singleton. Этот экземпляр инициализируется не более одного раза внутри метода getInstance.

Обратите внимание на использование нулевого значения, которое разрешает создание уникального экземпляра.

Как избежать исключения Null Pointer

Чтобы решить и избежать исключения NullPointerException, убедитесь, что все ваши объекты инициализированы должным образом, прежде чем использовать их.

Когда вы объявляете ссылочную переменную, вы должны создать указатель на объект и убедиться, что указатель не является нулевым, прежде чем запрашивать метод или поле у ​​объекта.

Кроме того, если выдается исключение, используйте информацию, находящуюся в трассировке стека исключения. Трассировка стека выполнения обеспечивается JVM, чтобы включить отладку. Найдите метод и строку, в которой было обнаружено исключение, а затем выясните, какая ссылка равна нулю в этой конкретной строке.

Опишем некоторые методы, которые имеют дело с вышеупомянутым исключением. Однако они не устраняют проблему, и программист всегда должен быть осторожен.

  1. Сравнение строк с литералами

Очень распространенный случай, выполнения программы включает сравнение между строковой переменной и литералом. Литерал может быть строкой или элементом Enum.

Вместо того, чтобы вызывать метод из нулевого объекта, рассмотрите возможность вызова его из литерала. Например:

Приведенный выше фрагмент кода вызовет исключение NullPointerException. Однако, если мы вызываем метод из литерала, поток выполнения продолжается нормально:

  1. Проверка аргументов метода

Перед выполнением вашего собственного метода обязательно проверьте его аргументы на наличие нулевых значений.

В противном случае вы можете вызвать исключение IllegalArgumentException.

  1. Предпочтение метода String.valueOf() вместо of toString()

Когда код вашей программы требует строковое представление объекта, избегайте использования метода toString объекта. Если ссылка вашего объекта равна нулю, генерируется исключение NullPointerException.

Вместо этого рассмотрите возможность использования статического метода String.valueOf, который не выдает никаких исключений и «ноль», если аргумент функции равен нулю.

  1. Используйте Ternary Operator

Ternary Operator — может быть очень полезным. Оператор имеет вид:

boolean expression ? value1 : value2;

Сначала вычисляется логическое выражение. Если выражение true, то возвращается значение1, в противном случае возвращается значение2. Мы можем использовать Ternary Operator для обработки нулевых указателей следующим образом:

String message = (str == null) ? «» : str.substring(0, 10);

Переменная message будет пустой, если ссылка str равна нулю. В противном случае, если str указывает на фактические данные, в сообщении будут первые 10 символов.

  1. создайте методы, которые возвращают пустые коллекции вместо нуля.

Очень хорошая техника — создавать методы, которые возвращают пустую коллекцию вместо нулевого значения. Код вашего приложения может перебирать пустую коллекцию и использовать ее методы и поля. Например:

  1. Воспользуйтесь классом Apache’s StringUtils.

Apache’s Commons Lang – это библиотека, которая предоставляет вспомогательные утилиты для API java.lang, такие как методы манипулирования строками.

Примером класса, который обеспечивает манипулирование String, является StringUtils.java, который спокойно обрабатывает входные строки с нулевым значением.

Читать еще:  Arrays fill java

Вы можете воспользоваться методами: StringUtils.isNotEmpty, StringUtils.IsEmpty и StringUtils.equals, чтобы избежать NullPointerException. Например:

  1. Используйте методы: contains(), containsKey(), containsValue()

Если в коде вашего приложения используется Maps, рассмотрите возможность использования методов contains, containsKey и containsValue. Например, получить значение определенного ключа после того, как вы проверили его существование на карте:

System.out.println(value.toString()); // В приведенном выше фрагменте мы не проверяем, существует ли на самом деле ключ внутри карты, и поэтому возвращаемое значение может быть нулевым. Самый безопасный способ следующий:

  1. Проверьте возвращаемое значение внешних методов

На практике очень часто используются внешние библиотеки. Эти библиотеки содержат методы, которые возвращают ссылку. Убедитесь, что возвращаемая ссылка не пуста.

Утверждения очень полезны при тестировании вашего кода и могут использоваться, чтобы избежать выполнения фрагментов кода. Утверждения Java реализуются с помощью ключевого слова assert и выдают AssertionError.

Обратите внимание, что вы должны включить флажок подтверждения JVM, выполнив его с аргументом -ea. В противном случае утверждения будут полностью проигнорированы.

Примером использования утверждений Java является такая версия кода:

Если вы выполните приведенный выше фрагмент кода и передадите пустой аргумент getLength, появится следующее сообщение об ошибке:
Exception in thread «main» java.lang.AssertionError
Также вы можете использовать класс Assert предоставленный средой тестирования jUnit.

Модульные тесты могут быть чрезвычайно полезны при тестировании функциональности и правильности вашего кода. Уделите некоторое время написанию пары тестовых примеров, которые подтверждают, что исключение NullPointerException не возникает.

Существующие безопасные методы NullPointerException

Доступ к статическим членам или методам класса

Когда ваш вы пытаетесь получить доступ к статической переменной или методу класса, даже если ссылка на объект равна нулю, JVM не выдает исключение.

Это связано с тем, что компилятор Java хранит статические методы и поля в специальном месте во время процедуры компиляции. Статические поля и методы связаны не с объектами, а с именем класса.

Несмотря на тот факт, что экземпляр SampleClass равен нулю, метод будет выполнен правильно. Однако, когда речь идет о статических методах или полях, лучше обращаться к ним статическим способом, например, SampleClass.printMessage ().

Оператор instanceof

Оператор instanceof может использоваться, даже если ссылка на объект равна нулю.

Оператор instanceof возвращает false, когда ссылка равна нулю.

В результате, как и ожидалось:

Not an instance of the String class!

Смотрите видео, чтобы стало понятнее.

Средняя оценка / 5. Количество голосов:

Спасибо, помогите другим — напишите комментарий, добавьте информации к статье.

Или поделись статьей

Видим, что вы не нашли ответ на свой вопрос.

Java 8 исключения

Язык программирования Java использует исключения для обработки ошибок и других особых ситуаций.

Исключение (exception)— это событие, которое возникает во время выполнения программы и прерывает нормальный поток выполнения инструкций.

Когда возникает какая-нибудь ошибка внутри метода, метод создаёт специальный объект, называемый объектом-исключением или просто исключением (exception object), который передаётся системе выполнения. Этот объект содержит информацию об ошибке, включая тип ошибки и состояние программы, в котором произошла ошибка. Создание объекта-исключения и передача его системе выполнения называется броском исключения (throwing an exception).

После бросания исключения система пытается найти его обработчик. Система выполнения проходит по стеку вызовов от текущего метода вверх, ища подходящий обработчик исключений.

Выбранный обработчик исключения ловит это исключение.

Если системе не удаётся найти подходящий обработчик исключения, то программа завершает своё выполнение.

В Java все классы-исключения являются наследниками от класса java . lang . Throwable , который в свою очередь имеет подклассы java . lang . Error и java . lang . Exception . Класс java . lang . Exception имеет дочерний класс java . lang . RuntimeException .

Согласно соглашению все бросаемые исключения являются наследниками трёх классов: java . lang . Error , java . lang . Exception или java . lang . RuntimeException . Технически можно бросить исключение, которое не является наследником этих трёх классов, но является наследником java . lang . Throwable , но так делать не принято.

Виды исключений в Java 8

Из описанных выше трёх классов выходит три вида исключений в Java:

  • Наследники java . lang . Error . Эти исключения возникают при серьёзных ошибках, после которых невозможно нормальное продолжение выполнения программы. Это могут быть различные сбои аппаратуры и т. д. В обычных ситуациях ваш код не должен перехватывать и обрабатывать этот вид исключений.
  • Наследники java . lang . RuntimeException . Это непроверяемый тип исключений вроде выхода за границу массива или строки, попытка обращения к методу на переменной, которая содержит null , неправильное использование API и т. д. В большинстве своём программа не может ожидать подобные ошибки и не может восстановиться после них. Подобные исключения возникают из-за ошибок программиста. Приложения может их перехватывать, но в большинстве случаев имеет гораздо больше смысла исправить ошибку, приводящую к подобным исключениям.
  • Наследники java . lang . Exception , которые НЕ являются наследниками java . lang . RuntimeException . Подобный тип исключений называется проверяемыми исключениями (checked exceptions). Это такой тип исключений, который может ожидать хорошо написанная программа, и из которых она может восстановить свой обычный ход выполнения. Это может быть попытка открыть файл, к которому нет доступа, или которого не существует, проблемы с доступом по сети и т. д. Все исключения являются проверяемыми, кроме наследников java . lang . Error и java . lang . RuntimeException . Любой метод, который может бросить проверяемое исключение, должен указать это исключение в клаузе throws . Для любого кода, который может бросить проверяемое исключение, это исключение должно быть указано в throws метода, либо должно быть перехвачено с помощью инструкции try — catch .
Ссылка на основную публикацию
Adblock
detector