java自学之路-day14
JAVA14
异常
引入
l Java代码在运行时期发生的问题就是异常
l Java中把异常信息封装成了一个类
l 当出现了问题时,就会创建异常类对象并抛出异常相关的信息
l 如异常出现的位置 原因等
继承体系
l java.lang
类 Throwable 可以被扔出去的类
l java中所有的错误和异常
l 直接已知子类:
Error, Exception
异常和错误的区别
l 数组访问越界是异常
Exception RuntimeException
编译,运行期间出现的 可以有具体的方式进行处理
l 数组空间太大是错误
Error
运行期间发生了错误 没有具体的处理方法 系统级别的问题 都是jvm所在系统发生的,并反馈给jvm 只能修改代码
异常产生的原因和处理方式
原因
l
l 方法内部出现问题 JVM检测出了异常 创建了相应异常的对象
l 方法内部无法处理 将异常的对象抛给方法的调用者
l 方法的调用者main 也无法处理 就将对象抛给了 main方法的调用者
l 也就是JVM虚拟机 然后JVM接收到异常
l 然后JVM将异常信息以红色字体输出到控制台 将程序在调用方法代码处停止
处理
throw关键字处理
l 方式使用时考虑异常出现 需要对传递的参数进行判断 看是否合法 如果不合法就要告诉调用者,这是就要用抛出异常的方式来告诉
l 在方法的内部抛出异常
l 示例
- 进行判断 执行抛出异常 throw new Exception(“信息”)
- 方法名后面 加 throws 异常类型 进行声明异常
- 方法调用时就要考虑到方法的异常问题 调用时就要有如果出现异常进行处理的方法,比如把异常抛给上一级 比如 main方法抛出给虚拟机
Try …catch…finally处理
l 格式
try { 可能出现异常的代码 } catch { 异常处理的方式 } finally { 必须要执行的代码 }
l 示例
- Main方法执行 数组定义
- 进入try代码块
- 调用方法
- 方法执行 判断为空 创建自己写好的异常类对象
- 把异常对象抛给方法调用者 后面的程序不再执行
- 方法调用者 的try检测到了有异常的发生 接收到了一个异常对象
- 将异常对象抛给catch代码块,处理这个异常
- Catch 抓住 捕获
- Catch可以捕获相应类型的异常
- Catch捕获到这个异常 进行处理
- 异常被处理 程序继续执行
多catch捕获
l 可以处理多个异常
l 注意事项
- catch写的异常有顺序概念
- 平级异常 : 抛出的异常类之间没有继承关系
- 平级异常没有顺序
- Ctrl t继承树
- 上下级关系的异常 必须越高级的父类写在下面
- 否则编译会报错
- 低级的catch会没用
finally代码块
l 必须要执行的代码
l 无论是否有异常出现,都执行该代码块
l 用于释放资源
try…catch…和throws怎么选择
l 用了有抛出异常的方法就要用try…catch…
l 否则一直往上抛异常就会导致程序停止
编译异常和运行时期异常
l 编译异常
- 调用了抛出异常的方法不处理编译就会失败(try throws)
l 运行异常
- 凡是抛出的异常是RuntimeException类或者是他的子类 都是运行时期异常
- 凡是方法内部抛出的是运行异常,不需要throws声明
- 调用者也不需要处理
- 设计原因
a) 运行异常不能发生
b) 但是如果发生需要程序员停止程序 修改源代码
c) 运行异常一旦发生 后面的代码就没有意义
案例
l 计算圆形面积
l 要调用运行时异常 处理传递半径为-1的情况
方法重写时的异常处理
l 父类的方法抛出异常
- 子类重写后可以不抛出异常
- 也可以不抛出异常
- 如果子类抛出异常 抛出的异常对象不能大于父类的异常
- 子类也不能抛出平级异常
- 原因
多态调用方法时 父类调用的是父类的原来的方法
- 父类抛出异常子类也不能抛出异常
- 子类方法抛出了异常 重写父类的方法中调用了该方法 抛出异常时只能用try catch抛出 不能向上抛出 因为父类没有抛出异常
Throwable类方法
l String getMessage()
对异常信息的详细描述
l String toString()
对异常信息的简短描述
l Void printStackTrace()虚拟机默认的调用方法
对异常信息追踪到标准的错误流
l 示例
自定义异常
引入
l Java预先定义了很多的异常
l 有些异常没有
l 因此需要自己写
l 例如 负数 分数
l 格式 xxxException
l 自定义异常类需要继承父类Exception
示例
l 计算成绩的平均数 传入负数的异常停止运算
l
l
l
l 大多数使用运行时异常
l 需要写空参构造器 有参构造器
l 有参构造器 中用super 调用父类构造即可