每个程序员都希望编写一个完美的程序。 也就是说,程序运行时没有任何障碍。
好吧,如果希望是马,乞g就会骑。 除了程序员的所有愿望之外,有时还会发生无法预料的情况。
这些不可预见的情况在Java中通常被归类为“例外”。 异常会干扰我们的代码的平稳运行,并在不处理的情况下终止程序。 处理异常涉及在异常发生时编写另一组代码来管理这些异常。
有两种例外,一类是我们无能为力的,另一类是我们可以做的。 对于第二类,正确处理异常非常重要,因为我们不希望代码因异常而终止。
当我们的代码以意外的方式运行时,就会发生异常(这就是为什么可以将异常视为一种错误)。 这些意外的方法可能是将数字除以零,尝试以不存在的索引访问数组或试图访问不存在的对象。 所有这些方式都会导致生成异常代码,这些代码不遵循正常路径或处理程序设计。
发生异常时,将向用户报告说明,以解释引起异常代码的原因。 报告此异常的行为称为引发异常。
异常处理是Java不可或缺的一部分。 每个Java开发人员都需要了解如何处理异常,以便他们可以编写干净,优美的代码 。
抛出异常
一辆使用劣质燃油的汽车会散发出烟,以便我们知道出了点问题– Java程序中引发的异常等效于该烟。 当Java程序中发生异常时,需要将异常报告给系统用户,以便用户确切了解出了什么问题。 通过向用户报告此异常,我们引发了异常。
程序员可以导致引发异常,或者Java语言引发异常。 当程序的用户执行某些已明确启动为程序中的非法或错误操作时,程序员可能引发异常。 同样,如果程序的输入违反了一些基本的算术或编程原理(例如,将数字除以零),并且程序运行的环境出现了内存不足等问题,则Java语言可能会引发一些异常。
因此,当Java程序引发异常时,会发生什么? 创建任何Throwable子类的对象,该对象根据异常的类型来解释异常的性质。 例如,可以引发ArithmeticException对象,这表明发生了算术错误。
可以从Java程序引发的任何异常都被视为Throwable类的对象,该类分为两个子类: Exception类和Error类。
程序员无法处理的异常在Error类中。 您可以修复的异常在Exception类中。
错误类别
有些例外就像自然灾害一样,它们会发生,而您只需要接受它们的发生即可。 属于Error类的异常是您无法修复的事情。 它们也只是发生,您必须接受它们的发生。
Error类异常通常用于表明您的代码运行环境存在问题。 这些类型的问题可能包括内存不足-内存不足的情况不是您编写代码来处理的事情,因此您不能简单地对其进行处理。 这些异常只会终止您的程序。
错误类异常是通过重新启动程序来修复的,但是只有在导致程序终止的环境中的问题得到解决之后,才能解决。 在我们的示例中,对该错误的修复可能包括手动恢复用于执行程序的空间。
只是知道Java不能解决Error类的异常。 程序所有者必须在代码终止后执行某些操作,以确保程序可以再次运行。
例外类别
在Exception类下发生时可以处理的异常。 Java编程语言具有多种异常,可以在子类RuntimeException下进行处理。
这些例外包括被零除的例外,当您尝试将数字除以零时会发生。
之所以能够处理Exception类的异常,是因为它们表示某些问题发生在代码内部,而不是在运行代码的环境中。
您可以通过编写代码来确保此类异常不会首先发生,从而避免此类异常;如果确实发生此类异常,则可以编写代码以确保这些异常不会终止您的程序执行。 为了处理异常,将它们放置在try块中 , 稍后我们将介绍它。
错误类和异常类之间的基本区别在于,错误类将导致程序终止并且无法对其进行处理,但是如果正确处理了异常,则可以使异常类不导致程序终止。
涉及异常的重要关键字
Java中的异常处理可以通过使用一些关键字(例如try,catch,throw,throws和finally)来实现 。 这些关键字用于管理如何引发和处理异常。
任何可能导致引发异常的代码都写入try块中。 可能引发异常的代码通常处理输入值,但不能保证始终是程序员想要的方式。
想象一个试图走路的婴儿。 您只需将手放在婴儿周围,以确保婴儿不会跌落并受伤。 同样,try块用于包围在运行时可能引发异常的代码。
在try块之后紧接着是catch块, finally块或两者。
catch块完全按照其名称的含义执行操作:它捕获try块中引发的异常。 由于可以引发许多异常,因此catch块必须指定要处理的异常类。
在catch块之外,还有finally块,当try块完成时, finally块才起作用。 因此,finally块等待try块执行。 请注意,try块之后可以是catch块,finally块或两者的组合。 如果try块具有catch块,则最后在catch后面运行,否则,finally块在try块之后立即运行。
因此,将finally块想象为try块的最终手段。 finally块通常用于处理try块可能未正确利用的资源。
通过使用方法标题中的throws关键字,方法或一段用Java执行特定功能的代码可以抛出一种异常。
Error或RuntimeException及其子类中的异常无需包含在throws语句中。 它们被归类为“未经检查的异常”,这些异常应以任何可能的方式加以阻止,并且不得有意识地允许其发生。
程序中可能发生的未经检查的异常数量如此之大,以至于我们无法将所有未经检查的异常都扔进一个方法中。 这将导致该方法失去其清晰度,因此Java假定运行程序的程序员没有故意抛出这些类型的异常。
发生问题时,每种方法都可能引发未检查的异常,因此无需在throws语句中添加未检查的异常。
throw关键字用于专门在方法中引发异常。 它只是用于动词throw中的常规用法:它抛出Throwable Class的对象。 您不能抛出不在Throwable类或其任何子类中的对象。 注意不要使用throw关键字抛出Unchecked Exceptions。 使用throw关键字引发Checked Exception。
为什么要处理异常?
因为我们编写的每个程序都会在某一时刻抛出异常,所以了解如何处理它们很重要,这样一来,异常不会总是在程序中每次发生时都终止 。
了解属于错误类或异常类的异常之间的区别可以帮助您确定是否可以解决问题。
在编写用于处理异常的代码时,请确保您理解并正确使用了try,catch和finally块,并记住尽力防止抛出未经检查的异常。
学习如何在异常发生之前进行处理将有助于您编写简洁,优雅的代码。
翻译自: https://www.javacodegeeks.com/2017/12/handling-exceptions-java.html