异常的定义
异常是在程序中导致程序中断运行的一种指令流。
异常结构
异常指的是Exception , Exception类, 在Java中存在一个父类Throwable(可能的抛出)
Throwable存在两个子类:
1.Exception(异常):程序编写或者执行过程中可能出现导致程序中断的指令流
2.Error(错误):JVM发出的错误操作,无法通过代码处理,只能避免
异常主要分为受检异常(运行期异常)和非受检异常(编译异常)
1.受检异常:RunTimeException类,在编译的时候不会报错,只有在程序运行的时候可能会报错。
2.非受检异常:Exception的子类中,除了RunTimeException类外所有的子类都是非受检异常,在编译的时候,系统就会报错,提醒程序员处理这个异常
处理异常
try+catch(捕获处理异常)
try+catch格式
try{
// 有可能发生异常的代码段
}catch(异常类型1 对象名1){
// 异常的处理操作
}catch(异常类型2 对象名2){
try+catch的处理流程
finally
异常体系结构
// 异常的处理操作
} ...
finally{
// 异常的统一出口
}
try+catch的处理流程
1.异常产生的时候,系统会自动生成一个实例化的异常对象。
2.如果异常产生的语句在try中,那么就会捕获这个异常,在catch中找到相匹配的异常对象,如果异常不在try中,异常就会抛出。
3.如果找到相匹配的异常对象,就会进行catch中的处理语句。
finally
在异常处理中,finally是一个异常的统一出口,可写可不写。无论异常是否会发生,始终都会在执行finally中的语句块。
多异常捕获(不常用)
catch(异常类型1 |异常类型2 对象名){
//表示此块用于处理异常类型1 和 异常类型2 的异常信息
}//注意和多异常抛出的格式区别,这里异常之前的关系是 | (或)
异常抛出
程序员自己不处理这个异常,一级一级往上抛,如果中途如果没有捕获这个异常,最终会抛给JVM虚拟机,虚拟机会中断程序并且在控制台显示这个异常
throws关键字
随异常一起的还有一个称为throws关键字,此关键字主要在方法的声明上使用,表示方法中不处理异常,而交给调用处处理。throws后面一般都是跟受检异常,受检异常在编译是系统会报错,一定需要throws关键字,非受检异常一般不写。
格式:
返回值 方法名称()throws Exception{
}
throw关键字
throw关键字表示在程序中人为的抛出一个异常,因为从异常处理机制来看,所有的异常一旦产生之后,实际上抛出的就是一个异常类的实例化对象,那么此对象也可以由throw直接抛出。
public void setAge(int age) throws Exception {
if (age>150|age<0){
throw new Exception("输入的年龄有误");
}
this.age = age;
}
本来age只要输入的是Int形的数据,怎么输都没事,但是加了throw之后,符合if条件的数据,都会中断程序,抛出异常。
自定义异常类
编写一个类, 继承Exception,并重写一参构造方法 即可完成自定义受检异常类型。
编写一个类, 继承RuntimeExcepion,并重写一参构造方法 即可完成自定义运行时异常类型。
例如:
class MyException extends Exception{ // 继承Exception,表示一个自定义异常类
public MyException(String msg){
super(msg) ; // 调用Exception中有一个参数的构造
}
};
自定义异常可以做很多事情, 例如:
class MyException extends Exception{
public MyException(String msg){
super(msg) ;
//在这里给维护人员发短信或邮件, 告知程序出现了BUG。
}
};