欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-28 14:48:10
...

异常

程序在执行过程中,出现的非正常的情况,最终会导致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

相关标签: 从零开始学java