关于Java的异常捕获
2012-12-13 13:44
337 查看
一、 关于Java异常捕获的一点笔记:
先看代码:
对于以上代码,在函数f2中调用函数f1,f1()的功能就是throw一个Exception,再没有其他功能。
通过以上测试可以得出以下几个结论:
1. 如果catch块中有return语句,则f1()抛出例外后,catch块中的return语句是可以执行的,执行完“return 3”后,函数f2()便在此处退出,第16行之后的语句不再执行。
2. 如果catch块中没有return语句(将程序第16行的“return 3”注释掉),则f1()抛出的例外被catch捕获后,会执行catch{}块中的语句。catch块中的语句执行完之后,会继续执行try-catch以外的语句(第21行及以后的语句),于是“after call f1”会被打印,并且f2()返回0。
由此可以得出,抛出例外后,只会中断try{}块中的语句,try{}块以外的语句并不受影响,即不论是否抛出例外,只要catch{}里没有return语句,try{}块之后的语句都会被执行,不管这些语句是否在finally{}块中。
3. 那么finally{}块的存在与否有无区别呢?只有一点,当catch{}中存在return语句时(第16行),程序会先执行完finally块中的语句(第19行),再执行catch块中的return——执行顺序是第15、19、16行;这时,倘若代码语句(第19行)外没有finally{}包裹,这部分代码(第19行)便得不到执行,因为在catch块中已经return了。
而当catch{}中不存在return语句时(第16行被注释掉),语句外层是否有finally{}的包裹,其效果都是一样的(即不论是否有异常抛出,都会被执行)。
先看代码:
import java.io.FileNotFoundException; public class ExceptionTest { int f1() throws FileNotFoundException{ System.out.println("f1 Executed!"); throw new FileNotFoundException("aaa"); } int f2(){ System.out.println("before call f1"); try { f1(); System.out.println("in try after call f1"); } catch (FileNotFoundException e) { System.out.println("Exception"); return 3; } /* finally{ System.out.println("finally"); }*/ System.out.println("after call f1"); return 0; } public static void main(String args[]){ ExceptionTest test=new ExceptionTest(); int x=test.f2(); System.out.println("x="+x); } }
对于以上代码,在函数f2中调用函数f1,f1()的功能就是throw一个Exception,再没有其他功能。
通过以上测试可以得出以下几个结论:
1. 如果catch块中有return语句,则f1()抛出例外后,catch块中的return语句是可以执行的,执行完“return 3”后,函数f2()便在此处退出,第16行之后的语句不再执行。
2. 如果catch块中没有return语句(将程序第16行的“return 3”注释掉),则f1()抛出的例外被catch捕获后,会执行catch{}块中的语句。catch块中的语句执行完之后,会继续执行try-catch以外的语句(第21行及以后的语句),于是“after call f1”会被打印,并且f2()返回0。
由此可以得出,抛出例外后,只会中断try{}块中的语句,try{}块以外的语句并不受影响,即不论是否抛出例外,只要catch{}里没有return语句,try{}块之后的语句都会被执行,不管这些语句是否在finally{}块中。
3. 那么finally{}块的存在与否有无区别呢?只有一点,当catch{}中存在return语句时(第16行),程序会先执行完finally块中的语句(第19行),再执行catch块中的return——执行顺序是第15、19、16行;这时,倘若代码语句(第19行)外没有finally{}包裹,这部分代码(第19行)便得不到执行,因为在catch块中已经return了。
而当catch{}中不存在return语句时(第16行被注释掉),语句外层是否有finally{}的包裹,其效果都是一样的(即不论是否有异常抛出,都会被执行)。
相关文章推荐
- 关于存储过程和函数异常出现和JAVA捕获简单处理方案
- 【java解惑】关于异常捕获的三条要求
- 【java解惑】关于异常捕获的三条要求
- 有关于异常捕获点滴,plus我也揭揭java的短
- 无法捕获异常:Java关于在catch中抛出一个异常给外围函数却捕获不到该异常的思考
- java异常多级捕获
- JAVA 线程中的异常捕获
- Java 编程中关于异常处理的 10 个最佳实践
- java 中 哪些异常必须声明并捕获,否则产生编译错误
- java基础-并发-如何捕获线程异常
- java异常体系以及异常的捕获和处理和图解详解
- java异常-父类异常与子类异常之间的捕获关系
- 关于Java异常10件事儿<上>20170510
- 关于Java和C#自带日期转换类的异常问题
- 【Java笔记】try中捕获到异常后跳出try
- Java异常捕获 跟踪异常的传播路径
- 关于java异常处理的面试题
- Java异常捕获
- 关于异常java.lang.InstantiationException has no public zero-arg constructor
- Java 7多种异常捕获