代码之家  ›  专栏  ›  技术社区  ›  polygenelubricants

IllegalAccessError和IllegalAccessException之间的区别

  •  9
  • polygenelubricants  · 技术社区  · 16 年前

    考虑一下这双鞋 Throwable

    IllegalAccessException extends Exception

    当应用程序尝试以反射方式创建实例(数组除外)、设置或获取字段或调用方法,但当前执行的方法无权访问指定类、字段、方法或构造函数的定义时引发。

    IllegalAccessError ext IncompatibleClassChangeError ext LinkageError ext Error

    如果应用程序试图访问或修改字段,或调用其无权访问的方法,则引发。

    通常,这个错误被编译器捕获;只有在类的定义发生不兼容的更改时,才能在运行时发生此错误。

    问题

    • 有人能给出一个代码示例,其中每个都被抛出吗?
    • 名字上的相似是暗示两者之间的关系,还是纯粹的巧合?
    • 还有其他的吗 XXXError XXXException 联合体?这对情侣之间有什么关系?
    • try catch 一个在一个 Exception/Error 成对的,你也应该吗 其他的?
    3 回复  |  直到 6 年前
        1
  •  8
  •   Stephen C    16 年前

    有人能给出一个代码示例,其中每个都被抛出吗?

    这个 IllegalAccessException

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

    名字上的相似是暗示两者之间的关系,还是纯粹的巧合?

    有其他的XXXError和XXXException组合吗?这对情侣之间有什么关系?

    通过。检查javadocs。

    如果显式地尝试在异常/错误对中捕获一个,那么是否也应该捕获另一个?

    此外,作为一般规则,您不应该尝试从 Error . 分离的意义 错误 Exception

    非法访问错误 . 如果您试图重复导致问题的classloader操作,它将再次发生。

        2
  •  6
  •   Jesper    16 年前

    描述已经解释了其中的一些: Exception 在使用反射访问字段或调用不可访问的方法时引发;这个 Error 当您直接执行此操作时抛出(由于某些原因,编译器没有机会捕获它—例如,当您有一个旧版本的类文件时,其中您尝试使用的字段或方法是私有的)。

    错误 错误 XXXException ,也没有直接的理由去抓 XXXError . 文件

    错误是Throwable的一个子类,它表示合理的应用程序不应试图捕捉的严重问题。大多数这样的错误都是异常情况。ThreadDeath错误虽然是“正常”情况,但也是错误的一个子类,因为大多数应用程序不应该尝试捕捉它。

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

    要生成的示例 IllegalAccessException

    要生成的示例 IllegalAccessError A.java B.java . 在课堂上 A B ,调用该方法。编译源文件。现在,编辑 使方法私有化,只重新编译 爪哇语 爪哇文学士 B 将尝试调用该方法并抛出 .

    还有其他几对 xxx例外 / xxx错误 似乎有关联,但他们并不总是有完全匹配的名字;例如 ClassNotFoundException NoClassDefFoundError .

        3
  •  1
  •   Christian Semrau Louis Wasserman    16 年前

    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)中的其他类引用。所以我不知道他们是不是什么时候被扔的。