Java:异常体系
异常的类别:可处理异常,运行时异常,非运行时异常
子类重写父类方法,父类方法有异常抛出,
子类重写父类的方法?
不能比父类抛出更大的异常
前言:
java 中的异常处理机制你真的理解了吗?掌握了吗?
catch 体里遇到 return 是怎么处理? finally 体遇到 return 怎么办?finally 体里有 System.exit() 方法怎么处理?当 catch 和 finally 体里同时遇上 return 怎么办?
相信你在处理异常的时候不是每次都把它 throws 掉就完事了,很多时候异常是需要我们自己来 catch 并针对所抛出的 Exception 做一些后续的处理工作。
直接上代码,先贴下面测试需要调用的方法:
1
2
// catch 后续处理工作
3
public static boolean catchMethod() {
4
System.out.print("call catchMethod and return --->> ");
5
return false;
6
}
7
// finally后续处理工作
8
public static void finallyMethod() {
9
System.out.println();
10
System.out.print("call finallyMethod and do something --->> ");
11
}
12
1. 抛出 Exception,没有 finally,当 catch 遇上 return
1
2
public static boolean catchTest() {
3
try {
4
int i = 10 / 0; // 抛出 Exception,后续处理被拒绝
5
System.out.println("i vaule is : " + i);
6
return true; // Exception 已经抛出,没有获得被执行的机会
7
} catch (Exception e) {
8
System.out.println(" -- Exception --");
9
return catchMethod(); // Exception 抛出,获得了调用方法并返回方法值的机会
10
}
11
}
12
后台输出结果:
1
2
-- Exception --
3
call catchMethod and return --->> false
4
2. 抛出 Exception,当 catch 体里有 return,finally 体的代码块将在 catch 执行 return 之前被执行
1
2
public static boolean catchFinallyTest1() {
3
try {
4
int i = 10 / 0; // 抛出 Exception,后续处理被拒绝
5
System.out.println("i vaule is : " + i);
6
return true; // Exception 已经抛出,没有获得被执行的机会
7
} catch (Exception e) {
8
System.out.println(" -- Exception --");
9
return catchMethod(); // Exception 抛出,获得了调用方法的机会,但方法值在 finally 执行完后才返回
10
}finally{
11
finallyMethod(); // Exception 抛出,finally 代码块将在 catch 执行 return 之前被执行
12
}
13
}
14
后台输出结果:
1
2
-- Exception --
3
call catchMethod and return --->>
4
call finallyMethod and do something --->> false
5
3. 不抛 Exception,当 finally 代码块里面遇上 return,finally 执行完后将结束整个方法
1
2
public static boolean catchFinallyTest2() {
3
try {
4
int i = 10 / 2; // 不抛出 Exception
5
System.out.println("i vaule is : " + i);
6
return true; // 获得被执行的机会,但执行需要在 finally 执行完成之后才能被执行
7
} catch (Exception e) {
8
System.out.println(" -- Exception --");
9
return catchMethod();
10
}finally{
11
finallyMethod();
12
return false; // finally 中含有 return 语句,这个 return 将结束这个方法,不会在执行完之后再跳回 try 或 catch 继续执行,方法到此结束,返回 false
13
}
14
}
15
后台输出结果:
1
2
i vaule is : 5
3
4
call finallyMethod and do something --->> false
5
4. 不抛 Exception,当 finally 代码块里面遇上 System.exit() 方法 将结束和终止整个程序,而不只是方法
1
2
public static boolean finallyExitTest() {
3
try {
4
int i = 10 / 2; // 不抛出 Exception
5
System.out.println("i vaule is : " + i);
6
return true; // 获得被执行的机会,但由于 finally 已经终止程序,返回值没有机会被返回
7
} catch (Exception e) {
8
System.out.println(" -- Exception --");
9
return true;
10
}finally {
11
finallyMethod();
12
System.exit(0);// finally 中含有 System.exit() 语句,System.exit() 将退出整个程序,程序将被终止
13
}
14
}
15
后台输出结果:
1
2
i vaule is : 5
3
4
call finallyMethod and do something --->>
5
5. 抛出 Exception,当 catch 和 finally 同时遇上 return,catch 的 return 返回值将不会被返回,finally 的 return 语句将结束整个方法并返回
1
2
public static boolean finallyTest1() {
3
try {
4
int i = 10 / 0; // 抛出 Exception,后续处理被拒绝
5
System.out.println("i vaule is : " + i);
6
return true; // Exception 已经抛出,没有获得被执行的机会
7
} catch (Exception e) {
8
System.out.println(" -- Exception --");
9
return true; // Exception 已经抛出,获得被执行的机会,但返回操作将被 finally 截断
10
}finally {
11
finallyMethod();
12
return false; // return 将结束整个方法,返回 false
13
}
14
}
15
后台输出结果:
1
2
-- Exception --
3
4
call finallyMethod and do something --->> false
5
6. 不抛出 Exception,当 finally 遇上 return,try 的 return 返回值将不会被返回,finally 的 return 语句将结束整个方法并返回
1
2
public static boolean finallyTest2() {
3
try {
4
int i = 10 / 2; // 不抛出 Exception
5
System.out.println("i vaule is : " + i);
6
return true; // 获得被执行的机会,但返回将被 finally 截断
7
} catch (Exception e) {
8
System.out.println(" -- Exception --");
9
return true;
10
}finally {
11
finallyMethod();
12
return false; // return 将结束这个方法,不会在执行完之后再跳回 try 或 catch 继续执行,返回 false
13
}
14
}
15
后台输出结果:
1
2
i vaule is : 5
3
4
call finallyMethod and do something --->> false
5
结语:
(假设方法需要返回值)
java 的异常处理中,
在不抛出异常的情况下,程序执行完 try 里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有 finally 的代码块,
如果没有 finally 代码块,整个方法在执行完 try 代码块后返回相应的值来结束整个方法;
如果有 finally 代码块,此时程序执行到 try 代码块里的 return 语句之时并不会立即执行 return,而是先去执行 finally 代码块里的代码,
若 finally 代码块里没有 return 或没有能够终止程序的代码,程序将在执行完 finally 代码块代码之后再返回 try 代码块执行 return 语句来结束整个方法;
若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return。
在抛出异常的情况下,原理也是和上面的一样的,你把上面说到的 try 换成 catch 去理解就 OK 了 *_*
Java:异常体系的更多相关文章
- Java 异常体系(美团面试)
Java把异常作为一种类,当做对象来处理.所有异常类的基类是Throwable类,两大子类分别是Error和Exception. 系统错误由Java虚拟机抛出,用Error类表示.Error类描述的是 ...
- java(异常体系及权限修饰符)
java异常体系 异常的体系: 异常体系: --------| Throwable 所有错误或者异常的父类 --------------| Error(错误) --------------| Exce ...
- Java异常体系概述
Java的异常体系结构 Java异常体系的根类是 Throwable, 所以当写在java代码中写throw抛出异常时,后面跟的对象必然是Throwable或其子类的对象. 其中Exception异常 ...
- JAVA异常体系
1.异常体系 ----|Throwable 所有错误或异常的父类 --------|Error(错误) --------|Exception(异常)一般能通过代码处理 ------------|运行时 ...
- Java异常处理-----java异常体系
再三思考后还是决定贴图,csdn的格式,我是真玩不转,对不起了各位,继续将就吧. 错误原因:内存溢出.需要的内存已经超出了java虚拟机管理的内存范围. 错误原因:找不到类文件. 错误(Error): ...
- Java基础系列5:深入理解Java异常体系
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 前言: Java的基 ...
- Java——深入理解Java异常体系
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 前言: Java的基 ...
- Java异常体系及分类
上图是基本的java异常体系结构. 主要分为2大类:Error和Exception 1.Error:描述了Java运行系统中的内部错误以及资源耗尽的情形.应用程序不应该抛出这种类型的对象,一般是由虚拟 ...
- Java异常体系简析
最近在阅读<Java编程思想>的时候看到了书中对异常的描述,结合自己阅读源码经历,谈谈自己对异常的理解.首先记住下面两句话: 除非你能解决这个异常,否则不要捕获它,如果打算记录错误消息,那 ...
- 编程体系结构(02):Java异常体系
本文源码:GitHub·点这里 || GitEE·点这里 一.异常简介 优秀的程序代码,都在追求高效,安全,和低错误率,但是程序中的异常是无法避免的,降低异常出现的频率是关键,异常出现如何处理是另一个 ...
随机推荐
- 如何用Java实现反转排序
摘要:反转排序是将原先已经排序好了的重新排序,是原来的数组元素的顺序反转过来.假设原来的数组顺序是{6,5,4,3,2,1},反转之后的顺序就是{1,2,3,4,5,6}.这个排序的算法不是很难,代码 ...
- Xor Sum 2(位运算)
D - Xor Sum 2 Time limit : 2sec / Memory limit : 1024MB Score : 500 points Problem Statement There i ...
- DAG-背包九解-01背包
饭卡: 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够 ...
- notepad++调用python3中文乱码
使用notepad++,配置好快捷键调用python3,一切就绪,仿佛就差代码了,结果一使用, 中文乱码,一直没有好的解决办法. 最后只能在代码中增加一行重写向输出解决,示例如下: #!/usr/bi ...
- Shell应用之网卡流量监测
需求分析 1)按固定时间监测一次网卡流量 2)当网卡流量为0时重启网卡 一.网卡流量查询 sar(System ActivityReporter系统活动情况报告)是目前Linux上最为全面的系统性能分 ...
- 苹果下一代iPhone曝光
3月23日消息,据9TO5Mac报道,苹果下一代iPhone(以下暂命名为iPhone 11)可能会提供像三星Galaxy S10的PowerShare功能,能为Apple Watch和AirPods ...
- Rsyslog比较详细的
http://blog.csdn.net/fishmai/article/details/51842340
- spring的PropertyPlaceholderConfigurer不生效的问题
经常出现这种问题,每次都debug知道原因,但每次都会忘记,所以记录一下. 原因:maven项目中使用了非maven管理的jar包(通过systemPath引用),这些jar包没有放在${projec ...
- Android视图载入到窗体的过程分析
上一篇博客Android中Handler原理在讲到Handler的时候谈到了android的Activity启动是怎样运行到onCreate方法的,这篇主要从onCreate方法里面我们必需要写的方法 ...
- POJ2369 Permutations【置换群】
题目链接: http://poj.org/problem?id=2369 题目大意: 给定一个序列.问最少须要多少次置换才干变为 1.2.-.N 的有序序列.比方说给 定5个数的序列 4 1 5 2 ...