Java Error

2025年5月6日 | 阅读4分钟

错误定义了一个阻碍程序执行的合理性问题。在不同的编程语言中,根据概念的不同,会发生不同类型的错误。

本节将讨论 Java 中的错误以及不同类型的错误,以及这些错误发生的时间。

Java 中的错误是什么

Java 中,错误(Error)是 Throwable 的一个子类,它表示存在一个严重的严重问题,而一个合理的 Java 应用程序不应该尝试捕获该错误。通常,人们会注意到大多数发生的错误都是异常情况,无法通过正常条件解决。由于这些错误是异常情况,不应该发生,因此,错误及其子类被称为未检查异常。在 Java 中,我们既有错误的概念,也有异常的概念。因此,异常和错误之间存在一些区别。错误无法通过任何处理技术解决,而我们可以通过一些逻辑实现来解决异常。所以,当发生错误时,它会导致程序终止,因为错误无法被捕获。

Java 中的某些错误

Java.lang.Errors 在 Java 的 lang 包下提供了各种错误。其中一些错误是

错误名称描述
AbstractMethodError当 Java 应用程序尝试调用一个抽象方法时。
Error指示一个严重但无法捕获的错误已被抛出。这种类型的错误是 Throwable 的一个子类。
AssertionError表示断言失败。
ClassCircularityError在初始化类时,检测到循环。
IllegalAccessErrorJava 应用程序试图访问或修改一个字段,或者可能调用一个它没有访问权限的方法。
ClassFormatError当 JVM 尝试读取一个类文件,发现该文件格式错误或无法解释为类文件时。
InstantiationError如果一个应用程序试图使用 Java 的 new 构造函数来实例化一个抽象类或接口。
ExceptionInInitializerError表示在静态初始化程序中发生了意外的异常。
InternalError表示 JVM 中发生了意外的内部错误。
IncompatibleClassChangeError当某个类的定义发生不兼容的类更改时。
LinkageError它的子类指示一个类对另一个数据存在某种依赖关系。
NoSuchFieldError如果一个应用程序试图访问或修改一个对象的特定字段,之后该对象不再拥有该字段。
OutOfMemoryError如果 JVM 无法分配一个对象,因为它内存不足,则会抛出此错误,表明 GC 无法提供更多内存。
NoClassDefFoundError如果类加载器实例或 JVM 尝试加载类定义而未找到该类的任何类定义。
ThreadDeath当在 Thread 类中调用 stop 方法(不带参数)时,会在受害线程中抛出其实例。
NoSuchMethodError如果一个应用程序试图调用一个类的特定方法(可以是静态方法或实例方法),而该类不再拥有该方法的定义。
StackOverflowError当应用程序中的堆栈溢出发生,因为它递归得太深时。
UnsatisfiedLinkError如果 JVM 无法找到一个本地方法的定义所对应的合适的本地语言。
VirtualMachineError表示 JVM 已损坏或已耗尽继续运行所需的资源。
UnsupportedClassVersionError当 JVM 尝试读取一个类文件,并发现文件中的主版本号和次版本号不受支持时。
UnknownError如果在 JVM 中发生了某个未知的严重异常。
VerifyError当验证器发现一个格式正确的类文件实际上包含某种内部不一致或安全问题时。

让我们看一个示例实现,了解错误是如何抛出的。

Java 错误示例

上面的代码演示了系统崩溃的错误示例实现。

代码解释

  • 在上面的代码中,我们执行了一个栈溢出程序。
  • 在这个程序中,我们创建了一个名为 StackOverflow 的类,在该类中设计了一个执行无限递归的函数。
  • 接下来,在主类中,我们调用了这个函数,结果是无限递归。

执行代码后,我们得到了如下输出。

Java Error

为了停止无限执行,我们可能需要终止程序,因为它不会被任何正常情况处理。

错误 vs. 异常

Java Error

以下几点区分了这两个术语。

ExceptionError
可以处理无法处理。
可以是检查类型或未检查类型错误是未检查类型
仅在运行时抛出,但检查型异常由编译器已知,未检查异常则不知道。发生在代码运行时,编译器不知道。
它们定义在 Java.lang.Exception 包中。它们定义在 Java.lang.Error 包中。
程序实现错误会导致异常。错误主要由程序执行的环境引起。