博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java异常处理总结
阅读量:3777 次
发布时间:2019-05-22

本文共 2815 字,大约阅读时间需要 9 分钟。

1、try块后面可以有多个catch块,当包含catch子句时finally子句是可选的,包含finally子句时,catch子句是可选的。

2、在try块中当程序发生异常时后面的代码不会执行,进入catch代码块,catch代码对异常处理完毕后,程序作出向后执行,不会因为异常而终止。
3、无论try块中是否发生异常,finally块都会执行,除了try-catch代码块中执行System.exit(0),表示退出当前的java虚拟机。
4、
(1)在try或catch中有return语句,finally代码块中没有return语句,finally代码块中的语句仍旧会执行,程序执行到return语句时,会将变量保存,待执行完finally语句后,再返回,finally块中的语句不会影响最终的返回值,但finally块中的语句会改变变量的值。
(2)当try-catch代码块中都含有return语句时,具体可以分为两种情况:当try代码块中没有异常时,会执行try代码块中的return语句(return语句后面不能在有代码,因为程序执行到return时就停止了),但是程序时先将try代码块中return的返回值保存下来,跳过catch代码块(因为没有异常),执行finally代码块,finally代码块可能回改变catch代码块中return语句返回的变量的值,但是不会改变返回值(因为返回值已经保存了),若此时finally代码块中有return语句会执行return语句,并返回此时的返回值,(因此尽量不要在finally内写return),若finally代码块中没有return语句,程序会结束,并返回之前保存的返回值。
总结为:finally代码块一定会执行,若finally代码块中有return最终返回的是finally代码块中的返回值;若finally代码块没有return语句,try代码块中没有异常时,会执行try代码块中的return语句;若finally代码块没有return语句,try代码块中有异常时,会执行catch代码块中的return语句(finally代码块仍然执行,但不会改变返回值)。
1中的示例:

try代码块后可以添加多个catch代码块,finally代码块为可选的try {    	   程序代码1       }catch(异常类型1 e1) {    	   程序代码2       }catch(异常类型2 e2) {    	   程序代码3       }catch(异常类型3 e3) {    	   程序代码4       }try代码块后不加catch块,只有finally代码块               try {    	   程序代码1       }finally {    	   程序代码5       }try代码块后添加多个catch代码块,和一个finally代码块     try {    	   程序代码1       }catch(异常类型1 e1) {    	   程序代码2       }catch(异常类型2 e2) {    	   程序代码3       }catch(异常类型3 e3) {    	   程序代码4       }finally {    	   程序代码5       }

2对应的示例:

public class TestTryCatch {	public static int div(int a, int b) {		return a/b;	}	public static void main(String[] args) {		System.out.println("异常捕获开始");		try {			int val = div(10, 0);// 此处出现异常,后面的代码不会执行			System.out.println(val);					}catch(ArithmeticException e) {			System.out.println("捕获到了异常"+e);			return;//catch块中有return语句,finally块仍然会执行		}finally {			System.out.println("开始执行finally代码块");		}	}}

结果:

异常捕获开始捕获到了异常java.lang.ArithmeticException: / by zero开始执行finally代码块

3对应的示例:

package exception;public class TestTryCatch {	public static int div(int a, int b) {		return a/b;	}	public static void main(String[] args) {		System.out.println("异常捕获开始");		try {			int val = div(10, 0);// 此处出现异常,后面的代码不会执行			System.out.println(val);					}catch(ArithmeticException e) {			System.out.println("捕获到了异常"+e);			System.exit(0);			System.out.println("能不能执行");			return;//catch块中有return语句,finally块仍然会执行		}finally {			System.out.println("开始执行finally代码块");		}	}}

结果:

异常捕获开始捕获到了异常java.lang.ArithmeticException: / by zero

finally块没有执行。

4对应的示例:

package exception;public class TestFinally01 {	public static int get(){        int x =1;        try{            ++x;            return x;        }finally {            ++x;            System.out.println("finally:"+x);        }    }    public static void main(String[] args){        System.out.println("最终返回值:"+get());    }}

结果:

finally:3最终返回值:2

finally块改变了变量x的值,并没有改变返回值。

转载地址:http://qypvn.baihongyu.com/

你可能感兴趣的文章
Vue之侦听属性
查看>>
求职指南(1)
查看>>
MySQL day11
查看>>
MySQL day12
查看>>
JSONP原理
查看>>
Vue.js学习笔记—插值的操作(1)
查看>>
CSS的四种方式实现水平居中
查看>>
RISC-V生态架构浅析(认识RISC-V)
查看>>
? 精美图文带你掌握 JVM 内存布局
查看>>
谈谈go.sum
查看>>
tls 1.2 example
查看>>
GitHub 计划登陆中国,将产生哪些影响与意义?
查看>>
2019 我是怎样熬过来的?
查看>>
【C++学习计划】深入浅出——变量作用域(Day3)
查看>>
策略模式
查看>>
Spring Boot 实战 入门
查看>>
关于web系统整体优化提速总结
查看>>
分布式文件系统 - fastDFS
查看>>
BUAA OO 2019 第一单元作业总结
查看>>
格网编码查询方案在项目运用上的进一步探索
查看>>