从零开始的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
推荐阅读
-
java 学习笔记(入门篇)_java的基础语法
-
关于java学习中的一些易错点(基础篇)
-
Java基础篇——线程、并发编程知识点全面介绍(面试、学习的必备索引文档)
-
关于java学习中的一些易错点(基础篇)
-
从零开始的java学习Day16----------基础篇(函数式编程思想、函数式接口)
-
从零开始的java学习Day11----------基础篇(Java中的双列集合、泛型、可变类型)
-
从零开始的java学习Day12----------基础篇(异常)
-
从零开始的java学习Day14----------基础篇(File类、文件过滤器、递归、常见通信协议)
-
从零开始的java学习Day15----------基础篇(IO流)
-
Java基础篇——线程、并发编程知识点全面介绍(面试、学习的必备索引文档)