IllegalAccessError和IllegalAccessException之间的区别

pol*_*nts 9 java error-handling exception-handling

考虑这对Throwable:

IllegalAccessExceptionextends Exception

当应用程序尝试反射性地创建实例(数组除外),设置或获取字段或调用方法时抛出,但当前正在执行的方法无法访问指定类,字段,方法或构造函数的定义.

IllegalAccessErrorext IncompatibleClassChangeError ext LinkageError ext Error

如果应用程序尝试访问或修改字段,或调用其无权访问的方法,则抛出该异常.

通常,编译器会捕获此错误; 如果类的定义发生了不兼容的更改,则此错误只能在运行时发生.

问题

  • 有人可以给出每个抛出的代码示例吗?
  • 名字的相似性是否意味着两者之间的关系,还是仅仅是纯粹的巧合?
  • 还有其他XXXErrorXXXException组合吗?这些对是如何相互关联的?
  • 如果你明确trycatchException/Error对,你还应该catch另一个吗?

Ste*_*n C 8

有人可以给出每个抛出的代码示例吗?

IllegalAccessException当您尝试使用反射来调用方法或读取或写入Java可见性规则禁止的字段时,抛出此异常.

一个IllegalAccessError不能始终如一地编译Java代码抛出.例如,当您加载试图调用方法的类或读取或写入Java可见性规则禁止的另一个类中的字段时,就会发生这种情况.这是编译器通常会阻止的,所以这意味着类有严重错误.无论如何,这被认为是"错误"; 即不可恢复,类加载器将拒绝加载违规类.

名字的相似性是否意味着两者之间的关系,还是仅仅是纯粹的巧合?

两者之间有明确的关系.不同之处在于两者发生的情况.

还有其他XXXError和XXXException组合吗?这些对是如何相互关联的?

通过.检查javadocs.

如果您明确尝试在异常/错误对中捕获一个,您是否还应该捕获另一个?

可能不是.XXXError和XXXException通常在不同的情况下发生.(这当然适用于反射与类加载器.)

此外,作为一般规则,你不应该试图捕捉和恢复亚型Error.分离的整点ErrorException是区分不可恢复和(可能)可恢复的异常.

在这种情况下,正常的应用程序无法从恢复中恢复IllegalAccessError.如果您尝试重复导致问题的类加载器操作,它将再次发生.


Jes*_*per 6

该描述已经解释了其中一些:Exception当您使用反射来访问字段或调用不可访问的方法时抛出; 在Error当你这样做的直接抛出(出于某种原因,编译器没有赶上它的机会-例如,当你有一个旧版本的类文件的左右,其中外地或方法你想使用是私人的).

一个Error通常表明有一些真的错了-有几乎可以肯定在软件中的错误.你永远不应该试图抓住Error.如果你抓住了XXXException,没有立即理由也赶上了XXXError.文件Error说:

Error是Throwable的子类,表示合理的应用程序不应该尝试捕获的严重问题.大多数此类错误都是异常情况.ThreadDeath错误,虽然是"正常"条件,但也是Error的子类,因为大多数应用程序不应该尝试捕获它.

一个方法不需要在其throws子句中声明在执行方法期间可能抛出但未捕获的任何Error类,因为这些错误是永远不应发生的异常情况.

生成示例IllegalAccessException:通过反射,在类中查找私有方法并尝试调用它.

一个例子,生成IllegalAccessError:创建两个类,并将其保存在两个源文件A.javaB.java.在类中A,创建一个公共方法,并在类B中调用该方法.编译源文件.现在,编辑A.java并使该方法保持私有,并仅重新编译A.java(不B.java).现在再试一次; B将尝试调用该方法并抛出一个IllegalAccessError.

还有其他对XXXException/ XXXError似乎有关,但他们经常不完全匹配的名称; 例如ClassNotFoundException/ NoClassDefFoundError.