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

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

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异常的嵌套和级联的更多相关文章

  1. Java异常的面试问题及答案-Part 1

    本文由 ImportNew - 韩远青 翻译自 Journaldev. Java提供了一个健壮的.面向对象的方法来处理出现异常,称为Java异常处理.我以前写过一篇长文章来介绍Java异常处理,今天我 ...

  2. 全面理解Java异常的运行机制

    1. 引子 try…catch…finally恐怕是大家再熟悉不过的语句了,而且感觉用起来也是很简单,逻辑上似乎也是很容易理解.不过,我亲自体验的“教训”告诉我,这个东西可不是想象中的那么简单.听话. ...

  3. JAVA异常的捕获与抛出原则

    在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...

  4. 两张图解读Java异常与断言

    两张图解读Java异常与断言                                 --转载请注明出处:coder-pig 本节引言: 前天公布的"七张图解析Java多线程&quo ...

  5. 【开发技术】java异常的捕获与抛出原则

    在可能会出现exception的地方,要使用try-catch或者throws或者两者都要.我的判断依据是:如果对可能出现的exception不想被外部(方法的调用者)知道,就在方法内部try-cat ...

  6. Java 异常基础详解

    目录 1. Java 中的异常 1.1 什么是异常? 1.2 什么是异常处理? 1.2.1 异常处理的优势 1.3 Java 异常类的层次结构 1.4 异常类型 1.5 检查和未检查异常之间的区别 1 ...

  7. Java基础 -- 深入理解Java异常机制

    异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通 过API中Throwable类的众多子类描述各种不同的异常. ...

  8. JAVA 异常类型结构分析

    JAVA 异常类型结构分析 Throwable 是所有异常类型的基类,Throwable 下一层分为两个分支,Error 和 Exception. Error 和 Exception Error Er ...

  9. Java异常(三) 《Java Puzzles》中关于异常的几个谜题

    概要 本章介绍<Java Puzzles>中关于异常的几个谜题.这一章都是以代码为例,相比上一章看起来更有意思.内容包括:谜题1: 优柔寡断谜题2: 极端不可思议谜题3: 不受欢迎的宾客谜 ...

随机推荐

  1. java LinkedHashMap实现LRUCache缓存

    package java_map; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map ...

  2. Jupyter Notebook 更换主题(背景、字体)

    通过命令行窗口或 Anaconda Prompt 窗口 1.安装 Jupyter 主题 pip install jupyterthemes 2.更新 Jupyter 主题 (可选) pip insta ...

  3. springboot 整合 freemarker

    springboot 整合 freemarker 依赖 <parent> <groupId>org.springframework.boot</groupId> & ...

  4. jenkins中 Slave使用Docker

    原因就不说了,网上的自动化测试Docker教程太不靠谱,还是学学官网吧. 目的: 在现在各种虚拟化的大条件下,还在建立N个节点机器或节点机器搞N个并发,是不是太不方便了. 如果一个机器搞N个并发,在自 ...

  5. hdu5285-wyh2000 and pupil-(染色法二分图判定)

    http://acm.hdu.edu.cn/showproblem.php?pid=5285 题意:把互不认识的人分到两个组,第一组人数尽可能多. 题解:把互不认识的人连起来,当作二分图,二分图可能有 ...

  6. Pandas | 10 排序

    Pandas有两种排序方式,它们分别是 - 按标签 按实际值 import pandas as pd import numpy as np df=pd.DataFrame(np.random.rand ...

  7. 请写出css中选择器(元素选择器、类选择器、id选择器)的优先级顺序,和当各种选择器组合时,优先级的计算规则是什么?

    id选择器>类选择器>元素选择器 规则:选择器的权重值表述为4个部分,用0,0,0,0表示. 通配符*的权重为0,0,0,0 标签选择器.伪元素选择器的权重为0,0,0,1 类选择器.属性 ...

  8. Oracle客户端和服务端菜单区别

  9. 【BigData】Java基础_构造方法的使用

    需求描述 实现上图需求,根据输入的三个人的信息,分别计算出这个三个客户的平均年龄和最大年龄 涉及知识点: ①构造方法 ②字符串切割 ③对象数组 代码实现 代码结构图: package cn.test. ...

  10. Android Studio 之 ROM【3】,LiveData+ViewModel+AsyncTask+Repository+RecyclerView

    教程地址:https://www.bilibili.com/video/av65180549 源码地址:https://github.com/longway777/Android-2019-Tutor ...