//看一下下面的程序,你能正确的写出不同的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. Java如何使用catch来处理异常?

    在Java编程中,如何使用catch块来处理异常? 此示例显示如何使用catch来处理异常. package com.yiibai; public class UseOfCatch { public ...

  2. 异常处理----使用 try…catch…finally 处理异常

    使用 try…catch…finally 处理异常 异常处理是通过try-catch-finally语句实现的. try { ...... //可能产生异常的代码 } catch( Exception ...

  3. php写错命名空间 导致catch不到异常

    写的微信回调接口出错了, 由于手里的调试工具(包括微信官方的开发者接口调试工具)不能把HTTP错误的详情dump出来,只会显示空白,所以打算在程序里加上try catch 捕获错误直接输出.重新测试, ...

  4. php Try Catch多层级异常测试

    <?php class a { public function a1 () { try { throw new Exception('123'); } catch (Exception $e) ...

  5. 如何创建一个可以使用try.....catch.......捕获的异常

    代码很简单,大家一看基本上就能明白(有一定的java基础,熟悉try......catch.....finally的使用方法) package com.nokia.test1; public clas ...

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

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

  7. Java基础 try...catch(多个异常) 多个异常采取同样的解决措施

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  8. try/catch捕获处理异常

    1.throws是中断处理,后续代码不能执行 try/catch方法体之后的后续代码有没有异常都可以继续执行: 2.当try方法体中出现异常才会执行catch方法体中代码

  9. EF提交插入数据catch捕获具体异常方法

    try { db.SaveChanges(); } catch (DbEntityValidationException ex) { StringBuilder errors = new String ...

随机推荐

  1. 命令行解析Crash文件

    做了快两年的开发了,没有写过博客,最近公司app上架,程序崩溃被拒绝了,可是给的crash文件,又看不出哪里的问题,网上各种搜,终于找到了解决的办法,想想还是写个博客吧,希望给哪些也遇到这类问题的朋友 ...

  2. DateTime与DateTime?赋值问题以及null类型的如何赋值问题

    解决方案: //主要用到向下兼容原理,DateTime?继承于DateTime: string req = "为字符串的参数"; DateTime? dt = null; Date ...

  3. C语言-数据类型

    数据类型 -基本数据类型 --char 字符型 --int  整型 --浮点型 ---float ---double -指针类型 --void* -空类型 -构架类型 --数组[] --结构体 str ...

  4. Emacs-24.1 + ECB-2.40 + cscope-15.7a + cedet 无root权限指定目录安装与配置

    emacs等安装在-/INSTALL目录下,在-下新建一个INSTALL目录. 1. emacs-24.1.tar.gz ecb-2.40.tar.gz cscope-15.7a.tar.bz2下载到 ...

  5. SSH三大框架笔面试总结

    Java工程师(程序员)面题 Struts,Spring,Hibernate三大框架 1.Hibernate工作原理及为什么要用? 原理: 1.读取并解析配置文件 2.读取并解析映射信息,创建Sess ...

  6. iOS常用的忽略警告

    在iOS开发过程中,偶尔会碰到一些编译器警告,如果能够确定该警告不会影响到程序的正常运行,则可以手动告诉编译器忽略掉这个警告 iOS常用的忽略警告类型: 1.方法弃用警告 #pragma clang ...

  7. Android 自定义View 三板斧之三——重写View来实现全新控件

    通常情况下,Android实现自定义控件无非三种方式. Ⅰ.继承现有控件,对其控件的功能进行拓展. Ⅱ.将现有控件进行组合,实现功能更加强大控件. Ⅲ.重写View实现全新的控件 本文来讨论最难的一种 ...

  8. 给 admin 新建的 hdfs 文件的权限

    su hdfs hdfs dfs -chown -R admin /   org.apache.hadoop.security.AccessControlException: Permission d ...

  9. 使用curl 下载HTML

    简单的一个curl小例子: #include <iostream> #include <string> #include <sstream> #include &l ...

  10. Linux4:useradd、userdel、passwd、groupadd、chgrp、chown、df、du、sort、wget

    useradd 添加新的用户账号,只有root账户可以操作 -d 目录:指定用户主目录(默认在home下),若此目录不存在可同时使用-m创建主目录 -g 用户组:指定用户所属的用户组 -G 用户组:指 ...