java异常的嵌套和级联
一、分开捕获或者嵌套使用
我们先看看下面这段代码:
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
}
}
java异常的嵌套和级联的更多相关文章
- Java异常的面试问题及答案-Part 1
本文由 ImportNew - 韩远青 翻译自 Journaldev. Java提供了一个健壮的.面向对象的方法来处理出现异常,称为Java异常处理.我以前写过一篇长文章来介绍Java异常处理,今天我 ...
- 全面理解Java异常的运行机制
1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话. ...
- JAVA异常的捕获与抛出原则
在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...
- 两张图解读Java异常与断言
两张图解读Java异常与断言 --转载请注明出处:coder-pig 本节引言: 前天公布的"七张图解析Java多线程&quo ...
- 【开发技术】java异常的捕获与抛出原则
在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...
- Java 异常基础详解
目录 1. Java 中的异常 1.1 什么是异常? 1.2 什么是异常处理? 1.2.1 异常处理的优势 1.3 Java 异常类的层次结构 1.4 异常类型 1.5 检查和未检查异常之间的区别 1 ...
- Java基础 -- 深入理解Java异常机制
异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...
- JAVA 异常类型结构分析
JAVA 异常类型结构分析 Throwable 是所有异常类型的基类,Throwable 下一层分为两个分支,Error 和 Exception. Error 和 Exception Error Er ...
- Java异常(三) 《Java Puzzles》中关于异常的几个谜题
概要 本章介绍<Java Puzzles>中关于异常的几个谜题.这一章都是以代码为例,相比上一章看起来更有意思.内容包括:谜题1: 优柔寡断谜题2: 极端不可思议谜题3: 不受欢迎的宾客谜 ...
随机推荐
- ajax+vue简单使用
<script type="text/javascript" src="http://cdn.bootcss.com/vue/2.2.2/vue.min.js&qu ...
- EFK日志搭建
安装java 安装java1.8以上的版本并验证 [root@localhost ~]# yum install java [root@localhost ~]# java -version open ...
- SSH端口转发之本地转发
一.案例环境: 3台RHEL6.5 64虚拟机(分别为:HostA.HostB.HostC) IP地址: HostA:192.168.100.101 HostB:192.168.100.102 Hos ...
- 大众点评评论数据抓取 反爬虫措施有css文字映射和字体库反爬虫
大众点评评论数据抓取 反爬虫措施有css文字映射和字体库反爬虫 大众点评的反爬虫手段有那些: 封ip,封账号,字体库反爬虫,css文字映射,图形滑动验证码 这个图片是滑动验证码,访问频率高的话,会出 ...
- LOJ 3119: 洛谷 P5400: 「CTS2019 | CTSC2019」随机立方体
题目传送门:LOJ #3119. 题意简述: 题目说的很清楚了. 题解: 记恰好有 \(i\) 个极大的数的方案数为 \(\mathrm{cnt}[i]\),则答案为 \(\displaystyle\ ...
- Vue中美元$符号的意思与vue2.0中的$router 和 $route的区别
vue的实例属性和方法 除了数据属性,Vue 实例还暴露了一些有用的实例属性与方法.它们都有前缀 $,以便与用户定义的属性区分开来.例如: var data = { a: 1 } var vm = n ...
- ajax中responseText与responseXML区别
1."responseText”属性以字符串形式返回HTTP响应:“responseXML”属性以XML形式返回HTTP响应.function getTel() { var telText ...
- RabbitMQ六种队列模式-简单队列模式
前言 RabbitMQ六种队列模式-简单队列 [本文]RabbitMQ六种队列模式-工作队列RabbitMQ六种队列模式-发布订阅RabbitMQ六种队列模式-路由模式RabbitMQ六种队列模式-主 ...
- 协程,yield,i多路复用,复习
课程回顾: 线程池 队列:同一进程内的队列 先进先出 后进先出 优先级队列 线程池中的回调函数是谁在调用? 线程池中的回调函数是子线程调用的,和父线程没有关系 进程池中的会点函数是父进程调用的,和子进 ...
- 软件工程卷1 抽象与建模 (Dines Bjorner 著)
I 开篇 1. 绪论 II 离散数学 2. 数 (已看) 3. 集合 4. 笛卡尔 5. 类型 6. 函数 7. λ演算 8. 代数 9. 数理逻辑 III 简单RSL 10. RSL中的原子类型和值 ...