异常 【重点】
异常的概述
什么是异常
在Java程序编译和运行过程中,出现的不正常情况
Java是面向对象的语言,在Java中研究任何的东西都必须封装成对象,异常也不例外
有对象肯定有类,并且在Java的不正常可能非常多种,那么对应异常的类也会非常多,这些类
的共性不断向上抽取,就形成了异常的继承体系结构。
异常的体系结构
Throwable
|-Error:错误,严重问题,不要使用异常处理语句进行处理,这种错误情况的发生和代码逻辑、硬件等是有关系
这不是我们要研究和学习的问题
|-Exception:异常,非严重问题
|-编译时异常
|-运行时异常
异常的分类
编译时异常和运行时异常
编译时异常和运行时异常的区别
编译时异常
1、在Exception类下,除了RuntimeException及其子类之外的都是编译时异常
2、编译时异常在编译时期会报出,编译时期必须处理否则编译无法通过
运行时异常
1、在Exception类下,RuntimeException及其子类都是运行时异常
2、运行时异常在编译时期不会报出,编译时期可以处理也可以不处理
编译时期异常报出问题更早一些,起到提前提醒的作用
JVM默认处理异常的方式
JVM调用main方法,当main方法中出现了异常并且没有处理,则最终会交给JVM来进行处理
JVM如何处理:
1、将异常信息以红色字体显示在控制台
2、在出现异常的那行代码处结束程序
异常处理的方式
这里是程序员(我们)处理异常的方式
方式一:throws声明抛出处理
在方法的声明处使用throws关键字抛出处理异常
格式:
修饰符 返回值类型 方法名(参数列表) throws 异常类名1,异常类名2,... {
方法体;
}
这种处理异常的方式并没有真正的处理异常,而是将异常抛给调用者处理。
throws没有真正的处理问题,只是将编译的报错处理,从而可以编译通过
throws处理异常一般都只处理编译时异常,一般不去处理运行时异常,因为基本上没有意义
方式二:try...catch捕获处理
格式一:
try{
}catch(异常类型 变量名){
}
格式二:
try{
}catch(异常类型 变量名){
}finally{
}
格式三:
try{
}finally{
}
格式上的注意事项:
1、只有以上三种组合的格式
2、格式中包含catch的,其中的catch块可以有多个
3、try、catch和finally都是关键字
try:检测,存放可能出现异常的代码
catch:捕获,小括号用于捕获,大括号用于处理
finally:最终,存放一定会执行的代码,不论异常是否产生其中的代码一定会执行
finally一般由于做一些收尾工作,比如:IO流释放资源
这种方式才是真正处理异常的方式,这种方式既可以处理编译时异常,也可以处理运行时异常
处理编译时异常:
throws:不知道如何处理,或者不该在这里处理,或者懒得处理的这些情况,都是有throws
try...catch
总结:学习阶段判断编译时异常基本都throws处理即可
处理运行时异常
try...catch
注意事项:
1. 如果 try 中没有遇到问题,怎么执行?
把try中所有的代码执行完毕,并且不会进入到catch中,
try...catch语句下面有代码会继续执行
2. 如果 try 中遇到了问题,那么 try 下面的代码还会执行吗?
try中出现问题之后,下面的代码不会执行,会在出现问题的代码处直接进到catch执行
try...catch语句下面有代码会继续执行
3. 如果出现的问题没有被捕获,那么程序如何运行?
没有被捕获就相当于没有处理,最终还是交给JVM处理
4. 同时有可能出现多个异常怎么处理?
(1)每个异常使用一个try...catch语句单独处理
(2)一个try...catch语句,但是使用多个catch块
注意:大异常必须放在最后的catch中
Throwable的常见方法
String getMessage():获取异常信息,异常的原因
String toString():获取异常信息,原因和类型
void printStackTrace() :打印异常信息,原因、类型和位置
throws和throw的区别
throws:异常处理的方式之一
使用在方法声明上
throws后面跟的是异常类名,可以跟多个,多个之间使用逗号分隔
throw:不是异常处理的方式之一,你可以认为它是制造异常的方式
使用在方法体内
throw后面跟的是异常对象(名),只能跟一个,不能跟多个
自定义异常 [了解]
为什么要自定义异常
为了做到见名知义,JDK提供了很多异常的类,但是这些类无法穷举程序中碰到的问题,
此时我们可能需要自定义异常,看到这个异常的名字就能反映这个异常产生的原因
如何自定义异常
1、自定义一个类,继承RuntimeException或者Exception
自定义运行时异常:继承RuntimeException
自定义编译时异常:继承Exception
2、建议生成两个构造方法
一个是空参
一个是带一个字符串参数的构造:字符串参数的作用是可以传递异常产生的原因
自定义异常之后如何使用
和JDK提供的异常一样使用
编译时异常,编译时期不处理会编译不通过,必须处理,可以throws也可以try...catch
运行时异常,编译时期不处理不会编译报错,一般try...catch处理