从零开始的java学习Day12----------基础篇(异常)

异常

程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止
在Java等面向对象的变成语言中,异常本身是一个类,产生异常就是创建异常对象并抛出了一个异常对象。Java处理异常的方式是中断处理

异常体系

Throwable类是异常的根类,他下辖有两个子类
Error:严重错误Error,Java程序员无法处理的错误,例如服务器宕机
Exception:该异常产生后,程序员可以通过调整代码的方式纠正,使程序继续运行,是必须要处理的。(我们所说的和要处理的基本都是这类异常)

异常分类

编译时期异常:checked异常。在编译时期,就会检查,如果没有处理,编译会失败,程序不能运行。
运行时期异常:runtime异常。在运行时间,出现的异常,在编译时期不会报错。

异常的产生过程解析

程序在执行过程中,遇到异常,会终止程序继续运行,把产生异常的信息封装并生成一个对应的异常类对象抛给main主方法,main没有处理异常的能力,它会抛给它的上级,也就是JVM,,JVM处理的方式就是把这个异常对象显示在控制台上,也就是我们在控制台上看到的,异常类型,异常信息,异常出现的行数(从下往上看)。

抛出异常throw

在编写程序中,我们必须要考虑到程序出现问题的情况,比如,在定义方法时,方法需要接收参数。那么,当调用方法使用接受到的参数时,我们首先要对参数的数据进行合法的判断,数据若是不合法,就应该告诉调用者。这时需要使用抛出异常的方式来告诉调用者。
Java就提供了一个throw关键字,他就是用来抛出一个指定的异常对象。
格式:

hrow new 异常类名(参数);

参数主要看你异常类的构造方法,一般是用来设置该异常的提示消息。
执行抛出时,会终止程序运行。

Objects非空判断

Objects类里面有一个方法,可以判断元素是否为null,如果为null则抛出异常
格式:
Objeccts.requireNonNull(o)//该方法会判断o是否为null,如果不为null则返回o,如果为null则抛出异常NullPointerException。

声明异常throws

如果方法内通过throw关键字,抛出了编译时异常,而又没有做捕获处理,那么就必须通过throws进行声明,让调用者去处理。
这也算一种处理异常,但是只是处理编译上的异常,使程序可以正常运行
关键字throws运用于方法声明之上,用于表示当前方法不处理该异常,而是提醒该方法的调用者来处理异常.
格式:

修饰符 返回值类型 方法名(参数) throws 异常类名1,异常类名2{   }

注意:如果方法内有多个异常,可以用逗号隔开依次填写,如果异常之间是父子类关系,可以只写父类,也可以两个都写,但是注意,父类要 写在后面。

捕获异常try…catch

声明异常只能解决编译上的问题,如果实际发生了异常,只声明不处理,最后还是会终止程序运行。
如果想处理异常,我们就需要用try-catch语句块来处理异常
try-catch的方式就是捕获异常,对可能出现异常的语句进行捕获,然后再处理异常。
使用try…catch语句后,不管是否出现异常,程序都会继续往下执行
格式:

try{
     编写可能会出现异常的代码
}catch(异常类型  e){
     处理异常的代码
     //记录日志/打印异常信息/继续抛出异常
}finally{
}         //finally代码块,非必须,详情看下面的介绍

查看方法(可以供处理异常时使用,查看打印异常的信息):

String getMessage():获取异常的描述信息,原因(提示给用户的时候,就提示错误原因。
String toString():获取异常的类型和异常描述信息(不用)void printStackTrace():打印异常的跟踪栈信息并输出到控制台。
//:获取反射的方法抛出的异常描述信息方法(e代表异常对象)
e.getCause().getMessage()
注意:

1.catch后的异常类型可以是可能会出现异常类的父类(一般我们不知道会出现什么异常就用Exception)
2.try中出现异常,会自动跳转到catch,try内中的代码不会继续往下执行
3.如果try中没有出现异常,就不会执行catch内的代码

如果遇到多个异常,我们可以
  • 多个异常分别处理。
  • 多个异常一次捕获,多次处理。
  • 多个异常一次捕获一次处理。
    如果多个异常一次捕获,一定要注意上面的注意事项2

finally 代码块

在try…catch后面加上finally代码块代表只要执行了try语句,不管是否出现异常,或者执行了结束语句,都一定会执行(除非finally执行前程序结束运行)
注意:
如果前面有执行return语句,并且有返回值,会暂存这句retunrn语句(包括其返回值),等到finally代码块执行完毕后,再执行之前的retunrn,当然,如果在finally内也有结束方法的语句(例如retunrn),就不会再执行之前的了(因为已经结束付方法了)

异常注意事项

1、运行时异常(继承RuntimeException类)被抛出可以不处理。即不捕获也不声明抛出。
2、如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。(即不能抛出比父类抛出的更大的异常类)
3、父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出
4、当多异常处理时,捕获处理,前边的类不能是后边类的父类
5、在try/catch后可以追加finally代码块,其中的代码一定会被执行,通常用于资源回收。
6、如果finally有return语句,永远返回finally中的结果,避免该情况

自定义异常

我们在开发中,一些异常情况,可能是系统没有定义好的,但是我们实际又需要使用到(例如年龄为负数,考试成绩负数),那么就需要我们自定义异常类
编译异常:继承Exception
运行异常:继承RuntimeException

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值