打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
8.3异常的嵌套和级联

异常的嵌套和级联

这节我们需要探讨的问题是,如果我们需要try尝试捕获的异常不止一个,那么我们需要如何处理呢?

一、分开捕获或者嵌套使用

我们先看看下面这段代码:

public class Cal {

public int div(int a, int b) {
int result = a / b;
return result;
}

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int s = 0;

int num1 = 0;
int num2 = 0;

//1、这里可能会抛出异常
System.out.print('num1=');
num1 = scanner.nextInt();
System.out.print('num2=');
num2 = scanner.nextInt();

Cal cal = new Cal();
//2、这里也可能抛出异常
s = cal.div(num1, num2);

System.out.println(s);
}
}

在这段代码中有可能抛出异常的有两个地方,那么我们应该如何处理呢。

1、当然我们可以分开捕获。如下面的代码:

public class Cal {

public int div(int a, int b) {
int result = a / b;
return result;
}

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int s = 0;

int num1 = 0;
int num2 = 0;
//1、这里可能会抛出异常
try {

System.out.print('num1=');
num1 = scanner.nextInt();
System.out.print('num2=');
num2 = scanner.nextInt();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Cal cal = new Cal();
//2、这里也可能抛出异常
try {
s = cal.div(num1, num2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

System.out.println(s);
}
}

2、我们还可以在try里面嵌套的使用try语句。如下面代码所示:

public class Cal {

public int div(int a, int b) {
int result = a / b;
return result;
}

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int s = 0;

int num1 = 0;
int num2 = 0;

try {
//1、这里可能会抛出异常
System.out.print('num1=');
num1 = scanner.nextInt();
System.out.print('num2=');
num2 = scanner.nextInt();

try {
Cal cal = new Cal();
//2、这里也可能抛出异常
s = cal.div(num1, num2);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}



System.out.println(s);
}
}

二、使用级联捕获异常

上面介绍的这两种方法都不是好办法,以为过多的使用try捕获异常会影响程序的效率。所以我们推荐使用的是级联捕获异常。格式如下

try{

…...

}catch(ArrayIndexOutOfBoundsException e) {

……

} catch(ArithmeticException e) {

……

} catch(Exception e) {

……

}

注意:使用多重 catch 语句时,异常子类一定要位于异常父类之前。

所以以下这种方式是错误的。

try{

…...

} catch(Exception e) {

……

} catch(ArrayIndexOutOfBoundsException e) {

……

}

好,那么我们可以修改上面的代码如下:

public class Cal {
public int div(int a, int b) {
int result = a / b;
return result;
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int s = 0;

int num1 = 0;
int num2 = 0;
try {
//1、这里可能会抛出异常
System.out.print('num1=');
num1 = scanner.nextInt();
System.out.print('num2=');
num2 = scanner.nextInt();

Cal cal = new Cal();
//2、这里也可能抛出异常
s = cal.div(num1, num2);
} catch (ArithmeticException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (InputMismatchException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (Exception e) {
e.printStackTrace();
}
System.out.println(s);
}
}

由于多次的使用try或影响效率。所以我们如果碰到循环的时候,应该把try语句放到循环的外面,例如我们并推荐你这样写代码:

public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4 };
Cal cal = new Cal();

for (int i = 0; i < arr.length;="" i++)="">
try {
int s = cal.div(arr[i], 2);
} catch (Exception e) {
// TODO: handle exception
}
}
}

你可以修改成为这样:

public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4 };
Cal cal = new Cal();
try {
for (int i = 0; i < arr.length;="" i++)="">
int s = cal.div(arr[i], 2);
}
} catch (Exception e) {
// TODO: handle exception
}
}


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何用 Java实现自己的Web服务器
Day2 第七个知识点 练习2
java实现远程桌面监控
(Java)简单循环语句学习
找工作 50道编程题Java实现(32-50)
Java语言基础知识整理汇总
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服