Java中的异常处理教程
该Java异常处理教程概述了异常处理。什么是Java异常层次结构,如何编写异常处理代码以及异常类型。
编写代码时,我们不只是编写Happy路径,因为它只是工作的一半。健壮的代码必须考虑到意外错误。 Java编程语言提供了一种强大的异常处理机制来处理这种异常情况。
什么是异常
可以将异常定义为破坏代码正常流程的条件。由于异常是在运行时发生的,因此当前的代码处理无法继续进行,因此需要处理由异常处理程序机制接管的异常。
异常处理可以通过继续程序的流程来处理该异常,或者显示适当的消息并终止应用程序。
Java中异常处理的工作方式
在任何方法中发生异常情况时,Java中用于异常处理的过程如下:
像创建任何其他Java对象一样,将创建一个异常对象。异常对象封装有关错误,异常类型以及发生异常的位置的信息。
停止执行该方法中的代码,并引发创建的异常。
异常处理机制寻找可以处理引发的异常的异常处理程序。引发异常的方法可以自行处理该异常,也可以将其留给调用方法来处理。
如果没有为抛出的异常提供异常处理程序,则将调用默认异常处理程序来处理该异常。默认异常处理程序从引发异常时开始打印堆栈跟踪,并终止程序。
如何在Java中管理异常处理
Java编程语言提供了五个关键字try,catch,finally,throw和throws来处理Java应用程序中的异常。
try –如果要处理方法本身抛出的异常,则需要提供try-catch块来处理该异常。可能引发异常的代码包含在try块中。
catch –将可能引发异常的代码包含在try块中,但是如何处理引发异常的代码。为此,我们需要在try块之后提供一个catch块。
最终–如果在try块完成后有任何必须执行的代码,则可以将其放在finally块中。无论是否在try块中引发异常,总是执行finally块中的代码。
throw – Java运行时可以引发异常,或者我们也可以手动引发异常。如果要手动引发异常,则可以使用throw进行处理。
例如
if(obj == null){ throw new NullPointerException("Null reference"); }
throws –如果我们不希望某个方法处理可能抛出自身的异常,则可以使用throws子句指定这些异常。
例如
void readFile() throws IOException{ .... .... }
try-catch-finally阻止异常处理
Java中的try-catch-finally块具有以下形式
try { // Code that may throw excpetion } catch (ExceptionType1 exp){ // Exception handler for ExceptionType1 } catch(ExceptionType2 exp){ // Exception handler for ExceptionType2 } finally{ // code that has to be executed after try block completes }
Java中的异常层次结构
在Java异常层次结构中,所有异常类型都是Throwable类的子类。在Java异常层次结构中Throwable的正下方是两个子类,它们将异常分为两个不同的分支。这些子类是Exception和Error。
错误–错误及其子类定义了程序无法处理的异常,例如内存不足错误。例如– StackOverflowError,OutOfMemoryError
异常-异常及其子类定义程序可以处理的异常。 Exception的一个重要子类是RuntimeException,所有未经检查的异常都是RuntimeException的子类。
异常层次
异常类型
根据Java文档,Java异常处理中有三种异常类型
已检查的异常–这些是代码应能够预期并从中恢复的异常。 Java编译器甚至会迫使我们将预期引发检查异常的代码放入try-catch块中,或者使用throws指定它。除Error,RuntimeException及其子类指示的那些异常外,所有异常都是经过检查的异常。
错误-第二种例外是错误。这些是应用程序外部的特殊条件,应用程序通常无法预期或者从中恢复。例如,如果应用程序必须读取文件并打开该文件但由于某些与操作系统相关的问题或者应用程序外部的硬件问题而无法读取文件,则该文件将无法读取。在这种情况下,不成功的读取将引发java.io.IOError。
运行时异常–这些是应用程序内部的例外情况,这些应用程序通常无法预期或者从中恢复。逻辑错误或者代码中API的不正确使用将导致运行时异常。例如-如果我们要在传递的String对象上调用方法,即str.substring(),但是传递的String为null。这将在运行时导致空指针异常。
Java编译器不会对运行时异常强制使用try-catch块或者throws子句。在以上三种类型的异常中,错误和运行时异常统称为未检查的异常。
请参阅Java中已检查和未检查的异常之间的差异,以查看Java中已检查和未检查的异常之间的差异。
Java中异常处理的优点
Java中的异常处理提供了一种从运行时错误中正常恢复的机制。
通过将具有逻辑的代码与处理异常的代码分开,可以提供更好的设计。