Java中的异常处理不是一个容易的话题。初学者很难理解,即使是经验丰富的开发人员也可以花几个小时讨论应该如何抛出或处理哪些Java异常。
这就是为什么大多数开发团队都有自己的一套关于如何使用它们的规则。如果你是一个团队的新手,你可能会惊讶于这些规则与你以前使用过的规则有多么不同。
什么是异常?
简而言之,异常是程序执行过程中的异常情况。
出现问题时会发生异常。试图打开文件,但文件不存在?这就是异常。试图对对象调用方法,但变量为空?这也是异常。
什么是异常处理?
异常是不应该发生的坏事。但既然它们确实发生了,我们就需要处理它们。这种“处理”就是我们所说的异常处理。
异常处理是一种错误处理机制。当出现问题时,会抛出异常。如果不执行任何操作,则异常会导致应用程序崩溃。
或者您可以选择处理异常。也就是说,您确认问题发生了,防止应用程序崩溃,并采取必要的步骤,以便从错误中恢复或失败。
一如既往的错误处理
异常处理是一种错误处理机制,但它不是唯一的机制。如今,绝大多数编程语言都将异常处理作为一项功能提供,但情况并不总是这样。
没有异常的语言如何处理错误?
一种流行的方法是返回错误代码。例如,假设您有一个C函数,它接受一个整数数组和一个整数,然后搜索并返回与指定数字匹配的第一个项的索引。
当在数组中找不到该项时该怎么办?一个普遍的选择是返回-1。这种方法的优点是让代码易于推理:不会打断代码,也不会跳过代码。只是返回值的旧函数。
另一方面,这种错误处理策略鼓励函数的使用者始终检查错误值。
这些验证的数量之多会使代码受到污染。大量的防御性检查可能会隐藏重要的业务逻辑,从而降低代码的可读性和可维护性。
错误代码的另一个严重缺点是缺乏上下文。您可能知道代码“-5”意味着找不到某个文件,但哪个文件?整数不能轻易携带该信息。
这种方法的另一个问题是,有时,您无法返回值(例如,想想构造函数)。初始化对象时出错?有了错误代码,你就无能为力了。
异常的例外情况
出现异常是为了解决你刚刚读到的问题。
当抛出异常时,程序的控制流被中断。如果没有人处理该异常,则会导致程序崩溃。用户将看到异常消息,但他们很可能无法理解。消息甚至可能无法本地化为其语言。
简而言之,这不是一个好的用户体验。
因此,您需要处理异常(即使只是为了记录问题、显示更友好的错误消息,然后退出应用程序)。
为了处理抛出的异常,我们必须捕获它。我们通过使用异常处理块来实现这一点。当我们捕获异常时,程序的流控制被处理到异常处理块。在那里,我们可以做出必要的安排来处理例外情况。