Java基础(18)异常

十八.异常
异常:程序在执行过程中,出现的非正常现象
异常的处理:程序在执行过程中,出现的非正常现象,而这些非正常现象往往会对用户造成一定的损失
为了规避和减少用户的损失,我们需要在异常出现的时候,做出一些补救措施
一.异常与错误
java中异常与错误都是以对象的形式体现的,所以异常与错误对应的都有自己的类
     java中所有异常的父类都是Exception
     java中所有的错误的父类都是Error
     Exception和Error的父类是Throwable
异常与错误的区别:
     异常:程序员可以解决的问题   人祸
     错误:往往是底层问题,程序员通过代码无法解决的问题   天灾
二.异常的分类
1.运行时异常
从继承关系上来说 RuntimeException所有子类  都是运行时异常
运行时异常  又被称为  未检查异常   程序员不一定要进行异常的处理
例:
ArithmeticException
NullPointerException
ClassCastException
IndexOuotOfBoundsException
2.非运行时异常
从继承关系上来说  非RuntimeException的子类  都是非运行时异常
非运行时异常 又被称为 已检查异常 程序员必须进行异常处理
例:
ClassNotFoundException
IOException
EOFException
FileNotFoundException
SQLException
三.异常的产生
1.自动产生
当程序执行到错误代码时,异常会自动产生
2.手动产生
语法:
throw new  异常名(“异常的相关描述”);
注意:
throw标志着程序结束,所以throw以下的代码,都是不可达的代码,throw以下不写代码
3.异常的传递
(1)异常的传递:是按照调用链的反方向进行传递的,与方法的返回值传递方法是一致的,
异常总是会传递给调用者,最终异常会传递给JVM,JVM的异常后会终止程序
(2)异常出现:程序终止的同时,控制台会出现异常的堆栈信息,异常的堆栈信息中展示了
异常的类型 ,异常的描述,异常的传递流程,我们可以利用这些信息的定位找出错误,解决问题
四.异常的处理  重点
1.消极处理
语法:
方法声明  参数表()throws 异常名1,异常名2,异常名3....{
     
}
注意:
(1)消极处理:实际上并没有真正处理异常,而是在出现异常将异常抛给调用者,
让调用者进行处理,仅仅让编译器通过编译
(2)运行时异常,可以不处理的原因是因为,运行时异常默认采用消极处理,在出现异常时将异常抛给调用者
(3)在消极处理多个可能抛出的异常时,可以直接通过抛出其父类代替
2.积极处理  很重要
积极处理就是真正的处理异常,当异常出现时,会采用其他代码的执行方法从而使得代码不会终止
(1)try...catch语法:
try{
     可能出现异常的代码
}catch(异常类型1  变量名1){
     //出现异常类型1时的处理方案
}catch(异常类型2   变量名2){
     //出现异常类型2时的处理方案
}catch(异常类型3   变量名3){
     //出现异常类型3时的处理方案
}...
(2)try...catch语法的执行流程
a.当try中没有出现异常时,会执行try中所有的代码,而不执行catch中的代码
b.如果try出现了异常,则从出现异常那一行开始,终止try代码的执行
c.根据出现的异常类型  执行catch相关的异常处理代码块
(3)try...catch的注意事项
a.父类型的异常可以捕获  子类型的异常对象
b.异常在捕获时,是自上而下进行验证的,所以在声明捕获多个异常时,父类类型要放置在子类类型之下
c.如果try中不存在某些非运行时异常,那么catch中也不可以出现该非运行时异常
d.运行时异常,也可以采用积极处理,并且无论try是否可能出现该运行时异常,catch中都可以写该运行时异常
e.一个方法中可能会抛出多个异常,具体进行捕获时会按照异常对象真正类型进行捕获,异常也存在多态
3.异常处理的通用方案
(1)异常处理一般我们通过一个Exception类型的异常,来捕获所有异常
try{
}catch(Exception e){
     //输出异常信息
     e.printStackTrace();
     //进行补偿性代码的书写   有时候没有!
}
(2)catch中处理代码的常用模板  输出异常信息+(进行补偿性代码的书写)
(3)如何输出异常信息?
在进行异常的捕获时,实际上(Exception e)中异常类型  变量名  就相当于一个 ,特殊的局部变量,而该特殊的
局部变量可以在后面的{ }中使用,该变量会在异常出现时,被异常对象赋值
获取异常信息的方法:
a.printStackTrace() 在控制台上输出,当前异常的堆栈信息
b.getMassage()  获取异常的描述信息  返回值是异常的描述信息
4.非运行时异常转换为运行时异常    务必在二阶段前  搞明白
当方法中  出现非运行时异常时,我们必须要将异常进行处理,才能让代码,通过编译
     如果采用消极处理:调用者也需要进行异常的处理  不方便
     如果采用积极处理:代码可能会不被终止,导致后续程序出错
     非运行时异常转换为运行时异常,代码如下
try{
     System.out.println("m1开始");
     throw new SQLException("这是测试用的异常");
}catch (Exception e) {
     // TODO: handle exception
     e.printStackTrace();
      throw new RuntimeException ();
}
5.try...catch...finally结构
(1)语法:
try{
}catch{
}finally{
     //总是要执行的代码
}
finally代码块中,放置的是总是要被执行的代码,比如资源释放,资源关闭的代码...
(2)执行流程:
无论是try正常执行,还是出现了异常执行catch中的内容,在该结构执行的最后,都会执行
finally中的代码
(3)finally代码块中的相关注意事项
a.try与catch中return  会在finally中的代码被执行之后,才会被执行并返回,返回值结果
b.因为a的缘故finally中的return语句总会被执行,从而导致try与catch中的return失效,
所以在finally中使用return语句,需要谨慎
try...catch..finally结构可以相互嵌套:
结构小结:
try{}catch(){}
try{}catch(){}catch(){}catch(){}
try{}catch(){}finally{}
try{}catch(){}catch(){}catch(){}finally{}
try{}finally{}
try{ try{}catch(){}finally }catch(){}
try{}catch{ try{}catch(){}finally{} }
try{}catch(){}finally{ try{}catch(){}finally{} }
注意:
(1)try代码块不能脱离catch代码块或是finally代码块而单独存在
(2)try代码块后面至少有一个catch或是finally代码块
(3)如果catch代码块和finally并存,则finally代码块必须放在catch代码块后面
一个非常脑残的问题:
finally finalize  final 三者的区别?
1)final为修饰符,可以用于修饰变量、方法、类
① final修饰的变量(局部变量、实例变量、静态变量)是作用范围内的常量,只允许一次
赋值,不允许修改。
② final修饰的方法可以被继承,但是不允许被覆盖
③ final修饰符的类不能被继承,即没有子类
(2) finalize为方法名,是垃圾回收器(GC)进行回收垃圾对象时,JVM自动调用的方法
(3) finally为异常处理时和try结构一起应用,定义在finally中的语句,不管有没有异常,都
会被执行
五.自定义异常
我们自己的项目中 有一些非正常现象,而在JDK中对于这种非正常现象没有规定对应的异常,
这时候,我们根据需求,自定义异常
1.自定义运行时异常
写一个异常类,让该类继承RuntimeException以及其子类,那么该类就是一种
自定义运行时异常
class 类名 extends  RuntimeException以及其子类 {
     public 类名(){}
     public 类名(String message){
          super(message);
     }
}
2.自定义非运行时异常
写一个异常类,让该类继承Exception以及其子类  那么该类就是一种自定义运行时异常
class 类名 extends  Exception以及其子类 {
     public 类名(){}
     public 类名(String message){
          super(message);
     }
}
六.方法覆盖的最终语法   必须会
1.方法名参数表必须一致
2.返回值类型可以相同,或是父类返回值类型的子类类型
3.访问权限修饰符可相同或更宽
4.抛出的异常可以相同,也可以更小或不抛出

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值