среда, 13 февраля 2013 г.

RuntimeException и Exception, Java

Побывал на днях на собеседовании, и задали мне вопрос, чем же отличается RuntimeException от Exception?
Вопрос, элементарный, но я на нем зашился, хотя и знал и использовал и то и другое. Вопрос видимо был задан для того, чтобы понять, имеются ли общие представления о классе Exception как таковом.

Если заглянуть в Javadoc, что я при необходимости делаю, то видно, откуда растут ноги.
Если перейти выше по иерархии классов, к классу Exception, то становится понятно, что Exception для RuntimeException как и для других подобных классов является суперклассом.
Я не ответил и мне "сообщили", что RuntimeException используется для определения деления на ноль...  и всё, ни намека на что-то другое.
Но что это? В Javadoc указаны его субклассы, которые....

Вот список и описание подклассов RuntimeException:


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


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


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


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


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

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

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

EmptyStackException extends RuntimeException
  Выполнена операция выталкивания (pop) значения из пустого стека. тип обладает только конструктором без параметров, поскольку причина ситуации очевидна без дополнительных разъяснений (тип определен в пакете java.util).

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


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


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



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

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

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

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

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

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

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

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

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

Переводить с офф сайта не стал, переводы взял отсюда. Теперь я, да и вы, в курсе, что прежде чем идти на собеседование, неплохо было бы повторить основы Java. Что именно? Примерные вопросы на собеседовании есть по всему интернету, ищите.
Не смотря на то, что вы сможете выполнить тестовое задание, знание теоретических основ могут оказать существенное влияние на решение о вашем трудоустройстве :) Ведь предполагается, что не зная основ, человек не способен выполнять рабочие обязанности. Здесь есть доля правды, причем бОльшая доля.
По возможности попросите работодателя дать примерный план собеседования и какие специалисты будут участвовать в нем. Потому как, не уточнив это и ожидая собеседования с одним человеком, вы можете столкнутся с 4-5-ю специалистами.
К этому надо быть готовым, удачи! :)

2 комментария :

  1. Наверное имелось ввиду все же не знание, что RuntimeException - это наследник Exception и у него самого есть перечисленные вами наследники, а понимание разницы между проверяемыми (checked) и непроверяемыми (unchecked) исключениями: если исключение унаследовано от Exception (но не в ветке RuntimeException), то компилятор будет проверять обрабатывается ли оно внутри вашего метода. Если нет, то в сигнатуре метода данное исключение должно явно присутствовать в декларации throws.

    Из мэйнстримных языков такое поведение есть только в Java и является одной из самых спорных возможностей языка. Особенно с учетом того, что в стандартной библиотеке проверяемые исключения во многих местах применяются абсолютно нелогично. Классический пример - EncodingNotSupported - ну перехватили вы это исключение и что можете с ним сделать? Причем, если Java-машиной не поддерживается, например, UTF-8, то скорее всего эта Java-машина взорвана изнутри. Во многих хорошо известных библиотеках и фреймворках (Spring, Hibernate, JPA) отказались от проверяемых исключений, а проверяемые исключения, используемые платформой (например SQLException), оборачивают в свои собственные непроверяемые (DataAccessException).

    ОтветитьУдалить
    Ответы
    1. Да, наверняка, я как-то все дальше и дальше от Java отхожу, все больше забывается, все меньше практики(сижу на одном своем проекте без особого развития).
      А сколько всего еще остается, а может быть и останется не изученным, не понятым, не испробованным.
      Грустно это всё...

      Удалить