异常机制
正常情况下,程序按照我们希望的样子和步骤去执行,但是,代码就像人生,要是一帆风顺了,就要想想是不是哪里出事了。程序若是有报错还好,就怕没有报错。
实例
public class Test {
public static void main(String[] args) {
test(1, 0);
}
public static int test(int a,int b){
return a / b;
}
}
如上,除数等于0时会发生算数异常错误,程序直接中止。
异常是个什么样的
程序运行时,出现我们没有考虑的情况时,会出现异常,因为计算机是比较死板的,要严格遵守规则。
异常种类
运行时异常
数组越界、空指针异常等。
编译时异常
明确会发生的异常,必须要在编译阶段处理,不处理无法通过编译。
都是继承自父类异常类
错误和异常不是一个东西,有相似之处。 ERROR,错误等级高于异常。但是都继承于Throwable类。
异常处理有三种,不处理,立即处理(try-catch-finally结构处理),抛给调用处解决(throws),但是在main函数抛出会给JVM,这样是不行的,JVM会直接中断程序。
抛出异常
调用方法出现异常程序终止时,这时我们可以手动抛出一个异常来终止程序运行,同时告知上一级调用方法出现问题,有异常,终止程序。
public class Test {
public static void main(String[] args) {
test(1, 0);
}
public static int test(int a,int b){
ArithmeticException ae = new ArithmeticException("除数不能为0");
if (b == 0){
throw ae;
}
return a / b;
}
}
在构造方法可以写入原因,遇到异常未处理时,不会往后执行,直接结束程序。
运行结果指明异常种类,发生异常的地方,行数。从结构可以看出时堆栈的形式打印的。
有些不能直接抛出
必须指明异常具体种类,给出对应解决方案,不然是不能直接抛出的。
throws 关键词,会接着抛出异常,不会对其进行处理。如果没有异常,在重写时可以不抛出异常。
异常处理
自行处理异常需要捕获,使用 try-catch-finally结构。
try中写可能出现异常的语句,catch负责匹配异常对象并进行相应处理。
public class Test {
public static void main(String[] args) {
try{
test(1, 0);
}catch (ArithmeticException ae){
System.out.println("除数不能为0");
}
}
public static int test(int a,int b){
ArithmeticException ae = new ArithmeticException("除数不能为0");
if (b == 0){
throw ae;
}
return a / b;
}
}
在对异常进行处理后,程序可以正常开始结束
处理可以打印出错信息,告知调用者不要进行非法操作。
捕获要有相应匹配的类来进行处理。
catch捕获处理的只能是Throwable类及其子类。但是出现错误不要去捕获,直接处理,catch一般处理异常。catch可以写多个,捕获多种不同异常。但是要注意父类写子类前的话,会导致子类变成不可达的语句。多种不同的类型也是可以合并的,类似于或运算。
finally
无论如何都会执行的语句。