害怕错误,但不要用 Java 编写它们!您可能已经对Java 中的异常有所了解。今天,至少粗浅的知识会让你受益。我们将分析 Error 类和一种特殊的异常类型,当它出现在堆栈跟踪中时会吓到很多人。

在 Java 的异常层次结构的顶部是Throwable类,它有两个后代:

  • Exception,它负责程序中的错误。
  • 而我们今天的主角——Error 它负责 JVM 中的错误。
    值得一提的是,这些可能甚至不是编码错误,而是通常不依赖于开发人员的问题。

如何处理错误

当捕获“错误”时,除了logging之外,您不能在catch块中执行任何操作,因为我们正在谈论 JVM 本身的问题。

日志记录很好:当您遇到运行时错误时,您可以查看日志,了解其原因,并知道要修复什么。

由于您不知道在编写代码时可能会遇到什么样的错误,因此在 catch中编写特定类型是没有意义的。使用Error类本身也不是最好的解决方案,因为在这种情况下,您只会捕获错误。

因此,最好使用Throwable类,它可以捕获ErrorException。这在实践中看起来如何?

这样写代码是不行的:

try {
    // Your code
} catch (OutOfMemoryError outOfMemoryError) {
    // Code to catch OutOfMemoryError
}
像这样写代码也不行:

try {
    // Your code
} catch (Error error) {
    // Code to catch all Errors
}
但是像这样的代码是可以的:

try {
    // Your code
} catch (Throwable throwable) {
    // Code to catch all Throwables
}

处理错误的第二个选项是在方法上声明throws子句后将它们抛得更高。当您的代码理论上可能会抛出错误并且您想预先警告可能使用您的代码的每个人以便他们能够正确处理错误时,可以使用此技术。

常见错误

一些最常见的错误是OutOfMemoryErrorStackOverflowError类。

OutOfMemoryError通常出现在程序没有足够的内存来创建对象而垃圾收集器跟不上的时候。结果是OutOfMemoryError

Java 不允许您手动删除对象以防止内存泄漏,但您可以避免乱扔垃圾,以免垃圾收集器过度工作,也不会弄乱堆。

例如,像这样的代码会在内存中产生大量垃圾:


while (true) {
    new Object();
}

我要告诉您的第二个错误是 StackOverflowError 它在堆栈溢出时抛出。由于堆栈主要存储局部变量、参数和方法调用,递归(或递归方法调用)是导致此错误的一个非常常见的原因:


public void foo() {
    foo();
}

为了避免程序执行期间出现问题,现代 IDE 经常警告递归调用方法。

您无法修复抛出错误的程序,但您可以编写不会抛出错误和破坏程序的代码。注意你对内存的处理,仔细创建对象,并正确调用方法。如果你这样做,那么你的代码中的问题就会更少。

错误和异常类型之间的区别

错误 例外
无法在catch块中更正 可以在catch块中处理
不会在编译时发生 可以在编译时捕获
JVM 中的问题 代码逻辑问题
所有错误都未选中 选中未选中

您无法在 Java 中逃避异常,但您不应该害怕它们。您只需要了解每种类型代表什么并知道如何处理它。今天就到这里!再见!