29 异常

作者: ca8519be679b | 来源:发表于2020-03-14 11:56 被阅读0次

    定义

    执行过程中国出现不正常情况,导致程序停止,java处理异常的方式是中断处理

    异常不是语法错误,语法错误编译就不会通过

    异常体系

    1

    异常体系java.lang包下,其2个子类Error和Exception,前者是错误,不能处理,只能避免,后者是使用不当

    2 3

    如上,我们还记得使用SimpleDateFormat实例时,parse需要throws ParseException,这是要我们在字符串解析不满足要求时能抛出异常

    4

    如上,我们还可以把throws ParseException注释掉,然后使用try{}catch(Exception e){}结构捕获异常,

    这种异常是编译时的异常

    5

    运行时异常如上,我们打印超Index的元素,这里还是可以用try catch捕获,当然对于catch部分,可以使用自己的操作方式。

    6

    如上就是个错误展示,提示堆溢出错误,这必须修改代码,无法规避的

    分析异常产生和如果处理异常

    7

    还是以简单索引越界来说明,当我们输入了越界索引,jvm会检测异常,创建异常对象,记录内容,原因,位置,这个getElement没有trycatch捕获,JVM就会把异常抛给调用者main方法处理,main也没有处理方法,最后返回到Jvm,jvm就做2件事,打印异常对象到控制台,终止java程序

    异常关键字

    try catch finally throw throws

    throw在指定位置抛出指定异常

    格式  throw new xxxException("异常原因和内容")

    需要注意的是,如果是抛出RuntimeException异常,我们一般不做处理,交给jvm

    如果是其他语法错误,我们需要处理这个异常,要么throws,要么try-catch

    8

    如上,我们对数组做了处理,判断是否为null,这里就故意传入,生成异常,我们可以传入自定义的文字描述异常,但是这样方法内没有捕获,main也没有,Jvm只能终止程序

    对于空指针异常和越界异常都属于运行异常,一般不做额外处理捕获,留给jvm处理

    Objects空指针对象判断requireNonNull

    9

    Objects工具类本身有个要求非空的方法,对于空对象会自带抛出异常

    10

    这样,我们每次判别非空,就使用默认方法即可,

    11

    当然此方法还支持重载,可以传消息字符串参数

    throws异常处理

    会把异常给方法的调用者处理,最终传给jvm,在方法声明时使用,一般配合throw

    格式     修饰符 返回类型  函数名 参数列表 throws aaaException,bbbException{

    throw new aaaException();

    throw  new bbbException();

    }

    其中,方法内部的异常必须throws声明,其对象可以是Exception或者其子类,如果抛出的异常有父子类关系,使用父类即可,调用此方法的方法要么继续throws交给上级或者直到Jvm,要么try-catch捕获异常

    12

    如上,我们设定不是特定路径就抛出文件未找到异常,这时调用它的main方法也会要求使用throws或者trycatch,我们在红色提示信息里可以看到,先由函数抛出异常,然后又main抛出异常,Jvm只能打印终止程序

    try-catch异常处理

    我们之前使用throws-throw,抛出异常后后面的程序就会中断,如果没有处理直到Jvm就会终止程序,而try-catch就是对特定异常实现处理

    格式 try{可能生成异常的代码}catch(异常类型 异常变量名){出现异常的处理,一般工作中会把异常记录到日志中}

    try可能生成多个异常,就要配合使用多个catch

    13

    Throwable类处理异常方法

    14

    如上3个方法,getMessage()返回异常的简短描述

    toString()返回throwable的详细描述

    printStackTrace()打印异常对象,此方法信息最全面

    15

    Finally代码块

    finally代码是必须和try一起配合使用,try{}catch{}finally(此代码无论是否出现异常都会执行)

    finally一般用于资源回收释放(IO)

    16

    多异常捕获

    分3种处理方法,1分别处理,2一次捕获,分别处理3一次捕获一次处理

    17

    如上,我们的2条语句分别会生成2个异常

    18

    分别处理如上,对每条语句进行捕获

    19

    由于第一个先捕获,所以没有出现第二个异常,这里需要注意的是,如果异常有父子类关系,子类必须写在上面,否则会报错

    20

    因为在父类捕获时就会捕获子类,如上,我们把顺序颠倒就会报错,因为数组的索引越界异常继承自索引越界异常

    21

    所以说的第三种使用父类的捕获即可,甚至可以使用Exception

    22

    finally return注意事项

    23

    代码如上,虽然没有任何异常,都会执行finally,我try里执行了return,但是finally的return才是最终返回的值

    父子类抛出异常

    如果父类抛出多个异常,子类重写方法可抛出相应异常或异常子类,或者不抛出异常

    父类如果没有抛出异常,子类方法不能抛出异常,生成异常只能trycatch捕获,不能声明抛出

    24

    代码如上

    自定义异常

    我们在Exception那知道其有很多子类,但是我们也会根据需要,使用自定义的异常(已有异常不够使用)

    格式和自定义类一样

    public class xxxException extends Exception(或RuntimeException){}

    内部定义无参和message的2种构造方法

    如果继承Exception说明是编译期异常,我们就必须抛出或者捕获

    如果继承RuntimeException说明是运行期异常,我们交给jvm处理

    25

    如上,定义异常,感觉没什么说的

    26

    设置如果用户在信息列表就报错,否则天使添加成功,如上为添加成功

    27 28

    当我们extends的是RuntimeException时,其实可以不写throws,因为交给jvm即可,我们若把其改成Exception,则会标红

    29

    相关文章

      网友评论

          本文标题:29 异常

          本文链接:https://www.haomeiwen.com/subject/zknejhtx.html