//看一下下面的程序,你能正确的写出不同的testEx2()方法时,程序的最终打印出来的数据吗....先不要看下面的答案
public class ExceptionTest {  public ExceptionTest() {  }  boolean testEx() throws Exception {  boolean ret = true;  try {  ret = testEx1();  } catch (Exception e) {  System.out.println("testEx, catch exception");  ret = false;  throw e;  } finally {  System.out.println("testEx, finally; return value=" + ret);  return ret;  }  }  boolean testEx1(){  boolean ret = true;  try {  ret = testEx2(); if(!ret){return false;}System.out.println("testEx1, at the end of try");  return ret;} catch (Exception e) {  System.out.println("testEx1, catch exception");  ret = false;  throw e;  } finally {  System.out.println("testEx1, finally; return value=" + ret);  return ret;  }  }  //第一种:/* boolean testEx2() throws Exception{  boolean ret = true;  try {  int b = 12;  int c;  for (int i = 2; i >= -2; i--) {  c = b / i;System.out.println("i=" + i);  }  return ret;  } catch (Exception e) {  System.out.println("testEx2, catch exception");  ret = false;  throw e;} finally {  System.out.println("testEx2, finally; return value=" + ret);  return ret;  } } *///第二种:boolean testEx2() throws Exception {  boolean ret = true;   int b = 12;  int c;  for (int i = 2; i >= -2; i--) {  c = b / i;  System.out.println("i=" + i);  }  System.out.printf("这句话打打出来了吗??????");return true;  }//第三种:/*boolean testEx2() throws Exception{  boolean ret = true;  try {  int b = 12;  int c;  for (int i = 2; i >= -2; i--) {  c = b / i;System.out.println("i=" + i);  }  return ret;  } catch (Exception e) {  System.out.println("testEx2, catch exception");  ret = false;  throw e;} finally {  System.out.println("testEx2, finally; return value=" + ret);  //return ret;  //此处不写return 语句} //System.out.println("fhsdfsdofi");//因为try中有一个直接return语句,所以这两句不能被访问//return ret;} *///第四种:/*boolean testEx2() throws Exception{  boolean ret = true;  try {  int b = 12;  int c;  for (int i = 2; i >= -2; i--) {  c = b / i;System.out.println("i=" + i);  }   } catch (Exception e) {  System.out.println("testEx2, catch exception");  //ret = false;  throw e;} finally {  System.out.println("testEx2, finally; return value=" + ret);  //return ret;  //此处不写return 语句} System.out.println("这句话打印出来了!!!!");return ret;} *///第五种:/*boolean testEx2() throws Exception{  //提醒一下,第四种和第五种只有catch中有没有 throw e 不一样boolean ret = true;  try {  int b = 12;  int c;  for (int i = 2; i >= -2; i--) {  c = b / i;System.out.println("i=" + i);  }  //return ret;  } catch (Exception e) {  System.out.println("testEx2, catch exception");  ret = false;  //throw e;} finally {  System.out.println("testEx2, finally; return value=" + ret);  //return ret;  //此处不写return 语句} System.out.println("这句话打印出来了!!!!!!!");return ret;}*/public static void main(String[] args) {  ExceptionTest testException1 = new ExceptionTest();  try {  testException1.testEx();  } catch (Exception e) {  e.printStackTrace();  }  }
}  class myException extends Exception{public void printException(){System.out.println("产生异常!");}
}/*异常看着容易,理解起来也很容易!但是它真的没有你想像的那么简单!
第一种:
i=2
i=1
testEx2, catch exception
testEx2, finally; return value=false
testEx1, finally; return value=false
testEx, finally; return value=false第二种:
i=2
i=1
testEx1, catch exception
testEx1, finally; return value=false
testEx, finally; return value=false第三种:
i=2
i=1
testEx2, catch exception
testEx2, finally; return value=false
testEx1, catch exception
testEx1, finally; return value=false
testEx, finally; return value=false第四种:
i=2
i=1
testEx2, catch exception
testEx2, finally; return value=true
testEx1, catch exception
testEx1, finally; return value=false
testEx, finally; return value=false第五种:
i=2
i=1
testEx2, catch exception
testEx2, finally; return value=false
这句话打印出来了!!!!!!!
testEx1, finally; return value=false
testEx, finally; return value=false总结一下:
一:throw new Exception()第一种情形:(由第二种情形验证)int test() throws Exception{if(....)throw new Exception();....return x;}第二中情形:第五种情况可验证int test() throws Exception{try{if(...)throw new Exception();}catch(ArithmeticException e){//在try中产生的异常没有被捕获时:....}finally{....}.....return x;}在执行到throw 时,第一种先将return返回个调用者(也就是throw和return之间的语句不会被执行),然后再调用程序中寻找处理异常的程序第二种还要将 finally中的语句执行完(即异常有没有被立即处理都要执行finally),(throw和return之间的语句也不会被执行),然后执行return语句,程序转向调用者中寻找异常处理程序。
二:再让我们看一下finally中写return的一些缺憾
1 finally块中的return语句会覆盖try块、catch块中的return语句
2 如果finally块中包含了return语句,即使前面的catch块重新抛出了异常,则调用该方法的语句也不会获得catch块重新抛出的异常,
而是会得到finally块的返回值,并且不会捕获异常,也就是如果在catch或者try中产生的异常如果在向外界抛出是不可能的。。。。第一种情况:testEx2()方法中会产生一个ArithmeticException的异常, Exception是它的父类,我们在该方法中捕获了该异常并进行了处理
所以会输出 testEx2()中的 catch 和 finally 中的输出数据, 而在testEx1()方法中,调用了testEx2(),由于testEx2()中的异常已经被处理
并且由于finally中的return语句导致testEx2()中catch中的throw e 无法重新抛出,所以在testEx1()中不会被捕获。再说一下第四,第五种情况:fianlly中都没有return
在第四种情况中, 由于在catch中继续抛出了该异常,该异常在testEx2()中没有被处理,所以在执行finally之后的语句(除了return语句)不会被执行,
而第五种是没有继续抛出该异常,也就是textEx2()中产生的异常全部被处理了,所以finally之后的语句会被执行.....其他不多说。如果还是没有搞懂的话,推荐看一下下面这个链接,写的不错....
http://blog.csdn.net/hguisu/article/details/6155636
*/

  

有关try..catch..finally处理异常的总结相关推荐

  1. try~Catch语句中异常的处理过程

    [2014/10/12 21:40]文章待续~ 1.函数自身捕获处理异常的情况 以下的样例介绍了try~catch语句中出现异常时语句的运行顺序: package month10;import jav ...

  2. java多层catch语句_Java异常之catch语句块

    今天在阅读项目代码时看到如下奇怪的代码,以为是竖线 | 可以作为多类型赋值,经过网上搜索才知道是Java SE 7新增的功能:一个catch捕获多种类型的异常.原文是Java官方的文档,现翻译如下.红 ...

  3. C# 中如何一次 catch 多个异常?

    咨询区 Michael Stum: 在项目开发中当抛出异常时,我会简单的用 System.Exception,但这种会捕获所有的异常,我不希望大一统,我只想捕获我预知的几个异常,然后在这里处理一些特定 ...

  4. java catch自定义异常_java异常类-java自定义异常-嗨客网

    Java异常类教程 我们在 我们可以看到,在 Exception 表示的是程序中出现了问题,可以直接使用 try - catch 来捕获处理.Error 一般值 Java常见异常 类名 描述 IOEx ...

  5. java try catch陷阱_java异常捕捉陷阱(内存泄漏,finally块,catch块,继承得到的异常)...

    1.    异常捕捉的陷阱 异常处理机制是java语言的特色之一,尤其是java语言的Checked异常,更是体现了java语言的严谨性:没有完善错误处理的代码根本不会被执行.对于Checked异常, ...

  6. JAVA→异常、异常类体系结构、try→catch→finally处理异常、throw new Exception(“重构异常“);、throws Exception{ }、自定义异常

    没有异常处理的话,程序发生异常,将终止. 有了异常处理的话,程序发生异常,也继续执行. 有try时,不发生异常执行try→finally,发生异常执行try→catch→finally 多个catch ...

  7. java catch后面_java 异常被catch后 将会继续执行的操作

    我就废话不多说了,大家还是直接看代码吧~ import java.util.UUID; public class Test { public static void main(String[] arg ...

  8. java catch抛出异常_java异常——捕获异常+再次抛出异常与异常链

    [0]README 0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java异常--捕获异常+再次抛出异常与异常链 的相关知识: [1]捕获异常相关 1.1)如果 ...

  9. java catch throwable_如何处理异常? catch Exception OR catch Throwable

    在Java中,当你需要统一处理异常的时候,你是会选择catch (Exception),还是直接catch (Throwable)? Java的异常体系 Throwable: Java中所有异常和错误 ...

最新文章

  1. 百度程序员抱怨:告诉下家去哪里,才给批准离职!
  2. Oozie使用java启动外部包
  3. 并发编程-03线程安全性之原子性(Atomic包)及原理分析
  4. 【 ➰斗艳争妍の网络协议姐妹花‍‍️➰】http协议 VS websocket协议
  5. 【学习笔记】第四章——文件 I(文件管理、逻辑结构、目录与文件分配方式)
  6. ftp搜索文件_Windows10下搭建FTP服务器详解(多图预警)
  7. python单元测试mock_Python单元测试的Mock是怎么回事
  8. camera (19)---Android 相机开发的基本流程
  9. android js 开屏动画,利用Flutter实现“孔雀开屏”的动画效果
  10. centos7.5 mysql5.7 的卸载和离线安装全过程
  11. html基礎之渐变属性(斑马线)
  12. Android Studio重启adb
  13. Raucous Rockers_usaco3.4.4
  14. PGM学习之四 Factor,Reasoning
  15. java_opts=quot;-server,tomcat高并发的配置
  16. Unity3D——主角面朝方向一定区域内对象角度计算
  17. java解析xml文件并写入Excel表
  18. VVIC api接口
  19. 谱定理、瑞利熵、PCA(主成分分析)、clustering algorihtm
  20. 【Unity数据持久化_Json】(二)Excel转Json

热门文章

  1. 如何将文件放到服务器,如何将服务器文件放到云服务器
  2. kivy python 读取oracle数据库_Kivy和Python线程-如何在它们之间获取数据
  3. jlinkarm目标程序和boot文件一起刷_华硕游戏手机Rog2代ROOT后wifi不能开启-刷回官方系统实用教程...
  4. python计算小数点后有几位_数学提高小数除法竖式计算过程
  5. c语言分手代码大全,C语言代码大全
  6. mysql可视化导入csv文件_我们如何将数据从.CSV文件导入MySQL表?
  7. java迭代器创建后mutx锁,java集合【5】—— Collections接口源码解析
  8. 一行代码解决IFrame自适应高度问题
  9. 保研软件学院和计算机学院,西南大学计算机与信息科学学院·软件学院(专业学位)计算机技术保研细则...
  10. jmeter测试java接口测试_简单易学的测试攻略:JMeter测试Java请求示例