java中的异常处理-try-catch-finally

在编写程序中,我们会遇到对程序的异常处理,如使用if-else解决异常问题,则会出现如下问题:
1.代码臃肿;
2.花费大量精力进行“堵漏洞”;
3.很难发现所有漏洞。
对此java使用异常机制为程序提供了错误处理的能力,整体处理流程如下:
在这里插入图片描述
一、异常定义及分类
在这里插入图片描述
二、异常的声明、捕获、调用
java中异常处理是通过5个关键字来实现的:
try、catch、finally、throw、throws
try:执行可能产生异常的代码
catch:捕获异常
finally:无论是否发生异常,代码总能执行
throw:手动抛出异常
throws:声明方法中可能抛出的各种系统异常
(一)try-catch-finally
1.当运行中没有异常时,执行顺序:try-finally-后续代码
在这里插入图片描述
2.当有异常且catch中异常可匹配时,执行顺序为:try异常前的代码-catch-finally-后续代码,当try中出现异常,try后面的代码将不再执行,如下图所示:
在这里插入图片描述
此处顺便说明一下printStackTrace为堆栈跟踪功能,显示除程序运行到当前类的执行流程。
printStackTrace():输出异常的堆栈信息;
getMessage():返回异常信息描述字符串是printStackTrace()输出信息的一部分。
3.当try中有异常但是catch中无匹配时,执行顺序:
try异常前代码-》catch逐一匹配-》程序中断
在这里插入图片描述
(二)存在多重catch时,需要注意的如下规则:
1)排列catch语句时,需要先子类后父类(这样抛出的程序异常是更清晰明确的);
2)发生异常时,程序是按照顺序进行匹配的;
3)只执行第一个与异常类型相匹配的catch语句。
1.实例
public class try_catchs {
public static void main(String[] args) {
int num1 = 0;
int num2 = 0;
double b[] ={2};
Scanner sc = new Scanner(System.in);
System.out.println(“请输入两个正整数:”);
try{
num1 = sc.nextInt();
num2 = sc.nextInt();
b[0] = num1/num2;
System.out.println(“输入的两个数的商为”+b[0]);
b[2] = num1+num2;
System.out.println(“输入的两个数的和为”+b[2]);
}
catch(ArithmeticException e ){
System.out.println(“请您输入的第二个数不要是0”);
}
catch(ArrayIndexOutOfBoundsException e){
System.out.println(“您定义的数组长度不够”);
}
catch(Exception e){
e.printStackTrace();
}
finally {
System.out.println(“除类似断网的异常外,都要执行我”);
}
System.out.println(“这是try-catch-finally后面的代码”);
}
}
2.
2.执行
当输入4和0时,优先触发第一个异常:
在这里插入图片描述
当输入4和2时,触发第二个异常:
在这里插入图片描述
(三)finally代码块
通过上面两部分的实例,我们可以知道,无论try-catch中是否出现异常,finally中的代码总是被执行,但是需要注意如下情形的finally的执行:
1)try或catch中包含return的代码,当执行到return时需要先将finally执行完毕,再return;
2)程序执行遇到退出java虚拟机的代码,此时不再执行finally(类似打网游过程中突然间断网的情形)
1.try中含有return的代码实例
在这里插入图片描述
2.catch中含有return的代码实例
在这里插入图片描述
3.处理程序中含有退出java虚拟机的语句
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44801116/article/details/106040290