JAVA异常处理

    xiaoxiao2021-03-25  61

    所有非正常情况被分为两种:异常(Exception)和错误(Error),他们都继承自类Throwable。Error是程序无力处理的错误,Exception是程序可以处理的错误。引入异常处理的目的是为了分离正常的业务逻辑和非正常的业务逻辑,提高程序的健壮性和可读性。 异常对象包含了异常的上下文信息,异常定义了常用方法来获得这些信息,方法有4个:

    getMessage(),返回异常的详细字符串描述printStackTrace(),将异常的跟踪栈信息输出到标准错误输出printStackTrace(PrintStream s),将异常的跟踪栈信息输出到指定的输出流上。getStackTrace(),返回异常的跟踪栈信息。

    捕获异常

    try{ //业务实现代码 }catch(Exception e){ //异常处理逻辑 } finally{ //资源回收 }

    如果try块里的业务逻辑代码执行时产生异常,会生成一个异常对象,该异常对象是被提交给运行环境JVM,即异常被抛出。JVM收到异常对象时,会寻找合适的catch块,如果找不到,程序将会退出。 JVM根据try块中的异常对象类与catch语句中的异常匹配,如果成功,则进入到该catch语句块中执行。异常对象与catch语句块中异常类型的匹配规则是:catch语句中的异常类型必须是当前异常对象的类型或其父类型。 关于异常处理,有三点需要明确。

    不管程序代码块是否处于try块中,甚至位于catch块中代码,只要执行该代码时出现了异常,都会自动生成一个异常对象。可以有多个catch块,不同的catch块对应不同的异常类,提供不同的处理方法。异常捕获时应先捕获小的异常,再捕获大的异常。从异常类的层次结构来看,应先捕获靠近叶子节点的异常。 finally语句块不处理异常,但是它一定会执行,通常情况下,finally都用于释放程序占用的系统资源。

    使用throws声明异常

    当不确定如何处理异常时,就需要声明异常。使用throws声明异常,可以同时声明多个异常类,以逗号隔开。一旦使用throws语句声明异常,就不需要在当前代码块中使用try….catch捕获异常了。

    throws ExceptionClass1,ExceptionClass2,.......

    如果某段代码调用了使用throws声明的方法,则表明该方法希望它的调用者处理该异常。调用代码要么放在try语句块中显式捕获该异常,要么在方法中使用throws声明该异常。

    throw抛出异常对象

    程序可以使用throw语句自行抛出异常,throw语句抛出的是一个异常实例,而且一次只能抛出一个异常实例。

    throw ExceptionInstance;

    异常转译

    异常转译就是将一种异常转换为另一种新的异常,新的异常更能准确表达程序发生的意外情况。 比如有一个SQLException类型的异常对象e,要转换为UploadException,可以这么写:

    UploadExcepiton uploadEX=new UploadException("SQL异常",e);

    这样就可以用统一的形式为最终用户提供信息了。

    自定义异常

    用户自定义异常应该继承基类Exception,如果希望自定义运行时的异常,则应该继承基类RuntimeException.异常类通常需要提供两种构造方法:无参数的构造方法和一个带字符串的构造方法,该字符串将作为该异常对象的详细说明(即异常对象的getMessage()方法的返回值)。实际上,在构造方法中,调用super是将字符串参数传递给异常对象的属性message,属性message就是一场对象的详细描述信息。

    转载请注明原文地址: https://ju.6miu.com/read-37722.html

    最新回复(0)