java异常处理机制
在生活中总有意料之外的悲剧,在你痛苦万分的时候总会有些人对你落井下石。这些意料之外的情况,就是异常。
程序在运行时也会出现各种各样的异常,Java在最开始的时候就已经设计好了各种各样可能出现的异常,我们只需要来使用这些已经编写好的异常处理机制,来规避和处理程序中可能遇到的异常;
简单的把异常分为三类:
检查性异常:最具有代表性的异常是用户错误或问题引起的异常,这是开发人员无法预见的,例如 用户输入的数据类型不匹配 一个异常就发生了 这些异常在编译时不能被简单的忽略。需要提前预判并做好相应的处理;
运行时异常:运行异常是可能被程序员避免的异常,与检查型异常相反,运行时异常在编译时会被忽略,在程序运行时才会暴露出来
错误:ERROR:错误不是异常,而是脱离程序员控制的问题,错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译时也检查不到。
异常的捕捉以及抛出
关键字:try catch finally throw throws
try: 用来检查存放可能出现异常的代码块;
catch: 用来捕捉异常 并且做出相应的处理 可以叠加;
finally:处理善后工作,无论程序是否有异常 都会执行finally代码块中的内容;一般用来关闭io流
throw:用来主动声明异常,一般在方法条件中使用
throws:用来抛出方法中的异常 给调用者处理 调用者在调用被声明异常的方法时 必须要进行 捕获 和处理
//创建一个方法 并把异常抛出给方法调用者捕获和处理
public void A(int a,int b) throws ArithmeticException{
if (b==0){ //当b为0时主动抛出异常
throw new ArithmeticException();
}
System.out.println(a/b); //输出a除b b不能为0
}
public static void main(String[] args) {
new test1().A(1,0);
}
输出结果:
Exception in thread "main" java.lang.ArithmeticException //算法报错
再写一个相同的方法把算法去掉试试:
//创建一个方法 并把异常抛出给方法调用者捕获和处理
public void A(int a,int b) throws ArithmeticException{
if (b==0){ //当b为0时主动抛出异常
throw new ArithmeticException();
}
// System.out.println(a/b); 将除法运算注释掉
}
public static void main(String[] args) {
new test1().A(1,0);
}
输出结果:
Exception in thread "main" java.lang.ArithmeticException //依然是算法报错
因为之前在b==0的条件判断语句中声明了算法异常 所以只要b==0 无论是否发生异常 都会抛出该异常;
在方法调用时用 try捕获处理异常
//在方法调用时 依旧让 b=0 程序报错
public static void main(String[] args) {
try {
new test1().A(1,0); //依旧传入b=0 让程序错误
} catch (ArithmeticException e) {
System.out.println("我是catch"); //当有异常被捕捉时执行
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
finally {
System.out.println("我是finally"); //无论是否有异常都会执行
}
}
}
运行结果:
我是catch //当有异常时 finally被执行了
我是finally
//在方法调用时 输入一个合法数字 让b=1
public static void main(String[] args) {
try {
new test1().A(1,1); //b=1
} catch (ArithmeticException e) {
System.out.println("我是catch"); //当有异常被捕捉时执行
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
finally {
System.out.println("我是finally"); //无论是否有异常都会执行
}
}
}
运行结果: // 程序未出现异常 catch未执行 finally执行了
我是finally
自定义异常
自定义一个类让它继承Exception类 在里面可以自定义一些想要捕获的异常
public class test1 extends Exception{
private int b;
public test1(int a){
this.b=a;
}
@Override
public String toString() { //当异常被捕捉时 会输出下面的语句
return "自定义的错误信息{" +
"b不能为" + b +
'}';
}
}
public static void main(String[] args) throws test1{
int a=11;
if (a>10){
throw new test1(a);
}
}
输出结果为:
Exception in thread "main" 自定义的错误信息{b不能为11} //自定义的错误信息被输出
at com.aaa.ViC_GymSystem.test1.main(test1.java:21)