------- android培训、java培训、期待与您交流! ----------
异常
-
异常体系的特点:异常体系中的所有类都具备可抛性。(就是可以被throw和throws关键字所处理)只有异常体系具备这个特点。
throw和throws的用法:
throw定义在函数内,用于 抛出异常对象。
thorws定义在函数上 ,用于抛出异常类,可以抛出多个。
当函数类容有throw抛出异常对象,并未进行try处理,就必须在函数上用throws关键字进行申明。(RuntimeException除外)
如果申明了异常,调用者需进行处理。处理方式可以抛出,也可以用try处理。
异常有两种:
编译时被检查异常(如果该异常没有处理,编译会失败)
该异常被标识,代表可以处理。
运行时异常(编译时不检测)
在编译时不需要处理,编译器不检查。该异常发生,建议不处理,,让程序停止;需要进行代码修正。
异常处理的语句:
try {
需要被检测的代码
} catch () {处理异常的代码
}final{
一定会执行的代码}
有三种结合方式:
1、try{
catch(){
}
2、try{
catch(){
}finally{
}
3、try{
}finally{
}
一般在finally中定义关闭资源代码。(当执行到System.exit(0)时finally不会被执行)
自定义异常:
自定义类继承Exception或者RuntimeException
1、让自定义类可抛。
2、让该类具备操作异常的共性方法。
当要定义自定义异常信息时,可以使用 父类已经定义好的功能,将异常信息传递给父类。
public class MyException extends Exception {
public MyException(String message) {
super(message);
}
}
自定义异常:按照java的面向对象思想,将程序中德特有问题进行封装
异常的额好处:
1、将问题进行封装。
2、将正常流程代码和问题处理代码相分离(便于阅读)
异常定义的原则:
1、处理异常的方式有两种: try或者throws。
2、调用到异常功能时,抛出几个,处理几个;一个try对应一个catch
3、多个catch时,弗雷父类的catch放在下面。
4、catch内需要定义针对性的处理方式,不要简单的打印。也不要不写。
5、当捕获到异常本功能处理不了时,可以继续在catch中抛出;如果该异常处理不了但并不属于该功能的异常。
可以将异常转换后,再抛出和该功能相关的异常。
异常注意事项:
在子父类覆盖时
1、子类抛出的异常必须是父类异常的子类或者子集。
2、如果父类或者接口没有异常抛出时,子类覆盖出现异常,只能处理,不能抛出。
示例:
public static void testException1() {
int[] ints = new int[] { 1, 2, 3, 4 };
try {
System.out.println(ints[4]); //捕捉到异常
} catch (IndexOutOfBoundsException e) {
//处理异常的代码
}finally{
//一定会执行的代码(除非虚拟机停止)
}
}
示例:运行时异常
//自定义异常类
public class NoValueException extends RuntimeException{
public NoValueException(String message) {
super(message);
}
}
public interface Shape {
void getArea();
}
public class Rec implements Shape {
private int len = 0, wid = 0;
public Rec(int len, int wid){
if (len <= 0 || wid <= 0)
throw new NoValueException("出现非法值"); //抛出运行时异常
this.len = len;
this.wid = wid;
}
public void getArea() {
System.out.println("面积是:"+len*wid);
}
}
public class Circle implements Shape {
private int r;
public static final double PI = 3.14;
public Circle(int r) {
if(r<=0)
throw new NoValueException("非法元半径");//抛出运行时异常
this.r = r;
}
public void getArea() {
System.err.println("圆面积是" + r * r * PI);
}
}
//测试类
public class Test {
public static void main(String[] args) {
Rec rec = new Rec(3, 4); //传入正确的值计算面积,传入错误的值虚拟机停止
rec.getArea();
Circle circle = new Circle(1); //传入正确的值计算面积,传入错误的值虚拟机停止
circle.getArea();
}
}