一、错误分为两种
1.编译型错误,一般都是语法错误,在明处,易解决;
2.运行时错误,就是异常,在暗处,不易找出;
二、什么是异常
程序运行时发生的错误叫异常,异常也是一个类;
异常分为两类:
Error:JVM中遇到的问题,比较严重的系统及问题,例如内存溢出,栈溢出等问题;
Exception:其他因编程错误或偶然的外在因素导致的一般性问题,例如数组下标越界,空指针,网断了;
源头:所有异常的父类是 Throwable;
Throwable的两大子类是Error,Exception;
多种:Exceptiond的几大子类是RunimExcetpion(编译时可以不处理,运行时发生的异常),
ArrayIndexOutofBoundsException,NullPointerException;
ClassCastException,ArithmeticException;
IOException,SQLException;
三、异常的处理
java中处理异常的机制被称为“抓抛模型”;
抓抛模型分为两个动作:
1.抛(throw):由jvm或程序(代码)往外抛出一个异常对象;
2.抓(catch):捕获某种类型的异常并处理;
三个关键字:
1.try{ }:将可能产生异常的代码段封装起来,必须有;
2.catch( ){ }:抓取, 有finally时,可以没有;
3.finally{ }:万金油,报不报错都执行,这一点与switch不同,有catch时,可以没有;
代码:
try{
多行代码
代码1
代码2
代码3
}catch(异常类型 异常对象){
}catch(异常类型 异常对象{
}finally{
}
执行过程:
1.如果try中不产生异常,则正常运行(不执行任何catch块中的代码);
2.如果在try块中产生异常,则整个try块中的代码不再运行,并将产生的异常封装成一个对象,向外抛出;对应的catch可按顺序进行捕获,如果类型匹配则进入catch块处理;
3.如果所有catch均不匹配,则继续向外抛出(try嵌套);如果都不能处理,则程序结束;
注意:
1.一个try块可以对应多个catch,catch是按顺序进行匹配的,如果匹配成功,将不会再继续匹配;
2.多个catch中的异常类型,应该先写子类,再写父类,因为父类包含子类,先写父类一定执行父类,不执行子类;
3.try不能单独,必须有catch或finally;
finally:
finally放在try,catch之后。
finally的作用:只要进入try块,无论是否出现异常,都会执行finally中的代码;
finally中一般编写必须要执行的代码,例如关闭资源;
四、Exception的常用方法
getMessage();//获得异常的信息说明;
printStackTrace();//打印异常的追踪信息,即哪个类,哪个方法,哪行代码产生的什么类型异常;
五、Exception可以分为两类
1.受检查异常:编译时必须处理;
2.运行时异常(RuntimeException的子类):编译时可以不处理;
注意:
1.所有RuntimeException的子类都属于运行时异常;
2.所有非RuntimeException及非RuntimeException子类的异常都是受检查异常;
六、throw与throws
throws:放在方法的定义中,表示此方法可能会产生什么类型的异常;
当调用一个方法时,可能会产生两种情况:
1.成功调用后,会返回一个结果;
2.调用失败后,会抛出一个异常;
方法的定义:
访问修饰符 特征修饰符 返回值类型 方法名(参数) throws 异常类型 { 方法体; }
public static double getLength(double radius) throws Exception{ 方法体; }
throw:放在语句中,手动抛出一个异常对象;
throw new 异常();
区别:
1.throws放在方法的定义中,说明此方法可能会产生某种类型的异常;
throws 异常类型;
2.throw表示手动抛出一个异常对象,放在语句中;
throw new 异常() ;
处理异常的方式
1.主动处理:自己写try代码处理;
2.回避处理:不处理,在定义的方法名后,加throws Exception;
自定义异常
自定义异常类型只需要继承两个类中的一个即可:
1.Exception:受检查;
2.RuntimeException:运行时;