java基础-异常

异常概述

什么时异常

java程序在编译或者运行中出现的问题

异常的继承体系

Throwable:java语言中所有错误或者异常的超类
Error:错误
Exception:异常

异常分类

运行时异常
编译时异常

在这里插入图片描述

异常和错误的区别

异常

java程序在编译或者运行时的问题
异常一般都是JVM产生的
可以针对异常进行处理,处理完不影响代码的继续进行,如过不及时处理程序直接退出

错误

java程序编译时出现的问题
错误往往都是由系统产生,由系统反馈给JVM
致命性问题,一旦出现,没有具体的处理方法,只能修改代码,程序直接退出

在这里插入图片描述

throwable常用方法

  • String getMessage()

     获取创建异常对象时指定的消息字符串信息
    
  • String toString()

     获异常对象的类全名和字符串信息
    
  • void printStackTrace()

     打印异常信息的栈信息,追溯异常根源
    

异常处理

JVM默认处理方式

将异常的类全名,原因,位置等信息打印到控制台,并结束程序
JVM接受得到异常对象时,会调用异常对象printStackTrace()方法

手动处理方法

抛出异常
捕获异常
异常处理之捕获处理

捕获处理的格式

try{

} catch(异常类名 变量名){

} finally{

}
格式说明
  • try代码块:用来存放可能出现的异常
  • catch:用来存放处理异常的代码
    在这里插入图片描述

异常处理之多catch处理

捕获处理的格式
try{

} catch(异常类名 变量名){

}...catch(异常类名 变量名){

}

格式说明

  • try代码块:用来存放可能出现的异常
  • catch:用来存放处理异常的代码

注意事项

  • 平级关系的异常:没有先后关系
  • 上下级异常:最高级的父类放在最后面

fianllay代码块

  • 特点

     只要进入try,无论是否出现异常,fianlly代码块都会执行
    
  • 作用

     一般使用释放资源,比如关闭IO流或数据库相关源
    

异常处理之抛出处理

throws和throw的作用

throw:抛出一个异常对象,将该异常对象抛给方法的调用者
throws:声明方法可能出现的异常,告诉方法调用可能出现的异常处理

throw关键字使用格式

throw new 异常类名("异常信息");
只能抛出Exception或者Exception的子类对象

throws关键字使用格式

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

throws和throw使用位置

throws:方法的声明
throw:方法体中

方法重写时异常的处理细节

  • 父类方法声明上没有声明抛出异常时

     子类在重写父类方法时也不能声明抛出异常
    
  • 父类方法声明上声明抛出了一个异常类型时

     子类在重写父类方法时可以声明抛出相同的异常类型或其子类类型
    
  • 父类方法声明上声明抛出了多个异常类型时

     子类在重写父类方法时可以声明抛出异常类型的子类
    
  • 小结

     子类重写方法时不能抛出比父类还大的异常
    

在这里插入图片描述

编译时异常和运行时异常的区别

  • 运行时异常的概念

     runTimeException及其子类属于运行时异常
    
  • 编译时异常的概念

     除了运行时异常类的所有异常都属于编译时异常
    
  • 运行时异常的特点

     方法内部抛出异常时运行时异常,该方法可声明,也可不声明
     方法声明上的声明的异常时运行时异常,该方法调用可以处理,也可以不处理
    
  • 编译时异常的特点

     方法内部抛出异常时编译时异常,该方法一定要声明
     方法声明上的声明的异常时编译时异常,该方法方法调用者必须对异常进行处理
    

自定义异常

自定义异常步骤

  • 命名规范:XxxException

  • 继承关系:

     Exception:如果要求一定要处理,则继承该类
     RunTimeException:不要求一定要处理,则继承该类
    
  • 构造方法:

     有参构造
     无参构造
    

常见问题

  • 程序出现问题的时候如何判断是错误还是异常?

     可以通过控制的错误信息来判断,如果类时以Error结尾则时错误,以Exception结尾则是异常
    
  • 捕获异常时是不是捕获Exception即可?

     不是,因为实际开发中,需要针对不同异常进行不同的处理方法
    

    在这里插入图片描述

  • 什么时候使用抛出处理?什么时候使用捕获处理?

     如果当前代码时直接跟用户打交道的,则应该捕获处理,如果不是,则可以使用抛出处理
    

    在这里插入图片描述

  • 父类方法没有声明抛出编译时异常,子类覆盖方法时发生了异常,怎么办?

     子类重写方法时不能抛出编译异常,但可以将编译时异常包装成运行时异常在抛出
    

在这里插入图片描述

  • 为什么java编译器对运行时异常管理的如此松散?

     因为运行时异常可以通过良好的编程习惯避免。
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值