第 6 章 错误处理 错误处理
本作品已使用人工智能进行翻译。欢迎您提供反馈和意见:translation-feedback@oreilly.com
在现实世界中,您总会遇到错误。如何处理这些错误有助于显示代码的质量。
Java 源自嵌入式系统--在专用设备中运行的软件,如手持式计算机、手机和花哨的烤面包机,如今我们可能将其视为物联网(IoT)的一部分。在这些应用中,稳健地处理软件错误尤为重要。大多数用户都会同意,因为软件故障而导致手机经常死机或烤面包机(甚至房子)被烧毁的情况是不可接受的。鉴于我们无法消除软件错误的可能性,有条不紊地识别和处理应用程序级错误是朝着正确方向迈出的良好一步。
有些语言将处理错误的责任完全留给程序员。语言本身不提供识别错误类型的帮助,也不提供轻松处理错误的工具。例如,在 C 语言中,函数通常通过返回一个 "不合理 "的值(如成语-1 或null )来表示失败。作为程序员,你必须知道什么是糟糕的结果以及它意味着什么。在数据流的正常路径中,要绕过传递错误值的限制,往往会很麻烦。1更糟糕的问题是,某些类型的错误几乎可以在任何地方合法地发生,而在软件中的每一个点明确测试这些错误既缓慢又昂贵。
在本章中,我们将讨论 Java 如何处理问题。我们将复习异常的概念,了解异常发生的方式和原因,以及处理异常的方式和位置。我们还将了解错误和断言。错误是更严重的问题,通常无法在运行时修复,但仍可记录下来进行调试。断言是通过提前验证安全条件是否存在来防止代码出现异常或错误的一种常用方法。
例外情况
Java 提供了一种优雅的解决方案,通过异常来帮助程序员解决常见的编码和运行时问题。(Java 异常处理类似于 C++ 中的异常处理,但又不完全相同)。异常表示异常情况或错误情况。当问题发生时,运行时会将控制权(或 "抛出")转移到代码中专门指定的部分,该部分可以处理(或 "捕获")该条件。这样,错误处理就与程序的正常流程无关了。我们不需要为所有方法设置特殊的返回值;错误由单独的机制处理。Java 可以将控制权从深度嵌套的例程中传递很远,并在需要时在单一位置处理错误,也可以在错误源头立即处理错误。少数标准 Java 方法仍会返回特殊值,如-1 ,但这些方法一般仅限于期望和处理特殊值相对简单的情况。2
您必须指定方法可能抛出的任何已知异常,编译器会确保方法的调用者处理这些异常。通过这种方式,Java 将方法可能产生的错误信息与方法的参数和返回类型同等重要。您仍然可以决定忽略某些错误,但在 Java 中,您必须明确地这样做。(我们稍后将讨论运行时异常和错误,它们不需要这种显式声明)。
异常和错误类
例外情况由类java.lang.Exception 及其子类的实例表示 。 Exception 的子类可以为不同类型的异常情况提供专门的信息(可能还包括行为)。不过,更常见的情况是,它们只是 "逻辑 "子类,仅用于识别新的异常类型。图 6-1显示了java.lang 包中Exception 的子类。通过该图,您可以了解异常是如何组织的。大多数软件包都定义了自己的异常类型,这些类型通常是Exception 本身或其重要子类RuntimeException 的子类,我们稍后将讨论这些子类。
例如,让我们看看另一个重要的异常类:java.io.IOException 。IOException 类扩展了Exception ,并拥有许多自己的子类,用于解决典型的 I/O 问题,如FileNotFoundException 。请注意该类名是多么明确(和有用)。许多网络异常进一步扩展了 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access