• java异常捕获案例,此题的出处是《Java编程思想》一书


    转自:https://blog.csdn.net/jackfrued/article/details/44921941

    class Annoyance extends Exception {}
    class Sneeze extends Annoyance {}
     
    class Human {
     
        public static void main(String[] args) 
            throws Exception {
            try {
                try {
                    throw new Sneeze();
                } 
                catch ( Annoyance a ) {
                    System.out.println("Caught Annoyance");
                    throw a;
                }
            } 
            catch ( Sneeze s ) {
                System.out.println("Caught Sneeze");
                return ;
            }
            finally {
                System.out.println("Hello World!");
            }
        }
    }

    今天看到这么一段代码,请问输出的内容是什么?

    先别给出答案,思考一下平时我们写代码的过程中,异常捕获的过程和顺序,比如有这么一段代码:

    try {
           throw new FileNotFoundException();
        } catch (IOException e) {
     
        }

    我们经常能看到这样的代码,也就是使用父类能够捕获子类的异常,当然所有的异常都是继承Exception的,那么为什么不用Exception替换所有具体的异常类呢?这个是要考虑到我们对代码中预期异常的掌握,也就是某些代码会产生什么样的异常,程序员应当心中有数,如果全都用Exception的引用来接收,大家都是稀里糊涂的,如何进行处理也会变得难以着手。但如果在Catch代码块中不打算做任何处理,仅捕获而已,那么这时使用Exception也没什么关系,但正是生产环境下,这样的情况应该不允许存在的,这个看JDK的源码就知道了,捕获异常以后一定要给出提示信息的。
    以上的代码证明了,我们可以用父类的引用接受子类的异常对象,那么问题来了,最上面的代码执行结果是什么呢?答案是:

    Caught Annoyance
    Caught Sneeze
    Hello World!
    

    相信第一行和第三行大家都没什么疑问了,关键是第二行,应该出来吗?是不是子类捕获了父类的异常呢?

    经过断点的加入,我们发现,尽管

    catch ( Annoyance a ) 

    这一句使用的是父类的引用,但实际上是子类的对象,这是java中多态的经典表现。在

    catch ( Sneeze s )

    的时候当然可以捕获到自己抛出来的异常了。

    为了证明,子类从本质上无法捕获父类的异常,我们继续做个试验:

    1 try {
    2  
    3             throw new Annoyance();
    4         } catch (Sneeze s) {
    5             System.out.println("Caught Sneeze");
    6             return;
    7         } finally {
    8             System.out.println("Hello World!");
    9         }

    可以看到,抛出了父类的异常,使用子类catch,这时候可以通过编译,但运行时呢?

    Hello World!
    Exception in thread "main" com.xq.exceptions.Annoyance
        at com.xq.exceptions.Human.main(ExceptionTest.java:14)

    可以看到,出了问题了,也就是说,父类throw出来的异常,子类并没有捕获到,继续往下证明:

     1         try {
     2  
     3             throw new Annoyance();
     4         } catch (Sneeze s) {
     5             System.out.println("Caught Sneeze");
     6             return;
     7         } catch (Exception e) {
     8             System.out.println("Caught Exception");
     9             return;
    10         } finally {
    11             System.out.println("Hello World!");
    12         }


    既然子类捕获不了,那就使用Exception,可以看到结果如下:

    Caught Exception
    Hello World!

    纸上得来终觉浅,绝知此事要躬行。
  • 相关阅读:
    【嵌入式linux】(第三步):安装串口终端 (ubuntu安装minicom串口终端)
    vim常用命令总结
    usb调试
    查找当前文件夹内容
    Android SDK开发包国内下载地址
    ubuntu下svn使用指南
    Ubuntu vim显示行号语法高亮自动缩进
    android_handler(一)
    HDU 1241 Oil Deposits (DFS)
    计划
  • 原文地址:https://www.cnblogs.com/chenglangpofeng/p/10648746.html
Copyright © 2020-2023  润新知