Разница между IllegalAccessError и IllegalAccessException - PullRequest
9 голосов
/ 19 июня 2010

Рассмотрим эту пару Throwable:

IllegalAccessExceptionextends Exception

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

IllegalAccessErrorext IncompatibleClassChangeError ext LinkageError ext Error

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

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

Вопросы

  • Может ли кто-нибудь привести пример кода, где каждый бросается?
  • Означает ли сходство в названии отношения между ними или это просто чистое совпадение?
  • Есть ли другие XXXError и XXXException комбо? Как пары связаны друг с другом?
  • Если вы явно от try до catch одного в паре Exception/Error, должны ли вы также catch другого?

Ответы [ 3 ]

8 голосов
/ 19 июня 2010

Может ли кто-нибудь привести пример кода, в котором каждый из них генерируется?

IllegalAccessException генерируется, когда вы пытаетесь использовать отражение для вызова метода или чтения или записи поля, которое являетсязапрещено правилами видимости Java.

IllegalAccessError не может быть сгенерировано последовательно скомпилированным кодом Java.Это происходит, когда, например, вы загружаете класс, который пытается вызвать метод или читает или записываете поле в другом классе, что запрещено правилами видимости Java.Это то, что компилятор обычно предотвращает, так что это означает, что с классами что-то серьезно не так.Во всяком случае, это считается «ошибкой»;то есть не подлежит восстановлению, и загрузчик классов откажется загружать нарушающий класс (ы).

Означает ли сходство в названии отношения между ними или это просто чистое совпадение?

Между ними существует четкая связь.Разница заключается в обстоятельствах, при которых они встречаются.

Существуют ли другие комбинации XXXError и XXXException?Как пары связаны друг с другом?

Pass.Проверьте javadocs.

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

Возможно, нет.XXXError и XXXException обычно возникают при разных обстоятельствах.(Это, безусловно, относится к рефлексивным и классовым загрузчикам.)

Кроме того, по общему правилу вы не должны пытаться поймать и оправиться от подтипов Error.Смысл отделения Error от Exception состоит в том, чтобы отличить невосстанавливаемые и (потенциально) восстанавливаемые исключения.

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

6 голосов
/ 19 июня 2010

Описание уже объясняет некоторые из них: Exception выбрасывается, когда вы используете отражение для доступа к полю или вызываете метод, который недоступен; Error выбрасывается, когда вы делаете это напрямую (и по какой-то причине у компилятора не было возможности его перехватить - например, когда у вас есть старая версия файла класса, в котором вы используете поле или метод) пытается использовать это личное).

Error обычно указывает, что что-то действительно не так - почти наверняка есть ошибка в программном обеспечении. Никогда не пытайтесь поймать Error с. Если вы ловите XXXException, нет никакой непосредственной причины также поймать XXXError. Документация Error гласит:

Ошибка - это подкласс Throwable, который указывает на серьезные проблемы, которые разумное приложение не должно пытаться устранить. Большинство таких ошибок являются ненормальными условиями. Ошибка ThreadDeath, хотя и является «нормальным» условием, также является подклассом Error, поскольку большинству приложений не следует пытаться ее перехватить.

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

Пример для генерации IllegalAccessException: С помощью отражения найдите приватный метод в классе и попытайтесь вызвать его.

Пример для генерации IllegalAccessError: создайте два класса и сохраните их в двух исходных файлах A.java и B.java. В классе A создайте открытый метод, а в классе B вызовите этот метод. Скомпилируйте исходные файлы. Теперь отредактируйте A.java, сделайте метод приватным и перекомпилируйте только A.java (не B.java). Теперь попробуйте снова бежать; B попытается вызвать метод и выбросить IllegalAccessError.

Существуют другие пары XXXException / XXXError, которые кажутся связанными, но у них не всегда есть точно совпадающие имена; например ClassNotFoundException / NoClassDefFoundError.

1 голос
/ 19 июня 2010

Существует несколько пар исключений / ошибок в java.lang, и все следующие имеют отношение к отражающему и прямому использованию:

IllegalAccessException / IllegalAccessError
InstantiationException / InstantiationError
ClassNotFoundException / NoClassDefFoundError
NoSuchFieldException / NoSuchFieldError
NoSuchMethodException / NoSuchMethodError

Другие примеры:

java.awt.AWTException / java.awt.AWTError
java.io.IOException / java.io.IOError

До сих пор я не знал, что эти две ошибки существуют, и на них нет ссылок из других классов в Javadoc (1.6). Так что я не знаю, если и когда они будут брошены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...