异常:就是程序在运行时出现的不正常情况(可能发生)
异常由来:问题也是现实生活中一个具体的事物 ,也可以通过java的类的形式进行描述,并封装成对象。
对问题的划分:
1.比较严重的————————Error类
2.对于非严重的,用Exception类进行描述
即:
Throwable
|--error 这类异常一般都是系统级的诸如系统崩溃,内存不足等,所以程序被建议终止。
|--exception
|--RuntimeException(,NullPointerException,ClassCastException,ArrayIndexOutOfBoundsException,
ArithmaticException):可以不处理,或者是和编译时异常一样采用抓抛模型处理。
|--CheckedException(非RuntimeException及其子类):必须要处理的(“抓抛模型”)
抓抛模型:捕获或者抛出(声明jse部分定义的异常throws,或者自己定义的异常throw,一般自己声明的异常继承RuntimeException)
一般我们秉承的处理原则是:
根据需求如果需要在程序内部进行处理那么我们就抓,处理不了就抛,如果抛出的对象是java中已经定义好的异常类型,我们就使用throws,否则我们使用throw抛出自己的异常对象。
抓:
java提供了特有的语句进行处理模型
try{
需要被检查的代码
}
catch(异常类,变量){
处理代码(处理方式)
}
finally{
一定要处理的语句:释放物理资源
}
抛:手动抛出和自动抛出
①手动抛出:throw +自己定义的异常类对象
throws和throw的区别
throws
用在方法声明后面,跟的是异常类
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
定义异常类的方法:①.继承Throwable和Exception类
②.有自己的序列号serialVersionUID
③.构造函数
package com.itheima;
public class FirstException extends Exception{
/**
* 自定义异常类
* 第一种定义方式,继承Exception类或者Throwable类
* @author JOHN
*
*/
/**
* 序列化ID
*/
private static final long serialVersionUID = -6982449779264524188L;
public FirstException() {
super();
}
public FirstException(String msg) {
super(msg);
}
public FirstException(String msg, Throwable cause) {
super(msg, cause);
}
public FirstException(Throwable cause) {
super(cause);
}
}
②自动抛出:throws+jse中定义好的异常类对象
思考:如果try和finally中都有return和throw,那么程序的执行顺序是怎么样的?
详见博客:
多异常的处理注意事项
(1)处理要具体
(2)多个异常对应多个处理块
(3)若异常之间存在继承关系,先声明子类异常再捕捉父类异常,否则将全部被父类异常接受
8.父类异常与子类异常在继承中的关系
1.父类中抛出异常则子类中抛出的异常只能是该异常的子类或者该异常。
2.父类中抛出多个异常时则子类中只能抛出该异常类的子集。
3.父类中没有抛出异常时,则子类不能抛出异常,或者有异常也只能对异常进行处理。