zoukankan      html  css  js  c++  java
  • java 异常

    http://blog.csdn.net/hguisu/article/details/6155636

    finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。在以下4种特殊情况下,finally块不会被执行:
    1)在finally语句块中发生了异常。
    2)在前面的代码中用了System.exit()退出程序。
    3)程序所在的线程死亡。
    4)关闭CPU。

    throw总是出现在函数体中,用来抛出一个Throwable类型的异常。程序会在throw语句后立即终止,它后面的语句执行不到,但是会执行finally中的代码

     如果所有方法都层层上抛获取的异常,最终JVM会进行处理,处理也很简单,就是打印异常消息和堆栈信息。如果抛出的是Error或RuntimeException,则该方法的调用者可选择处理该异常。

    Throws抛出异常的规则:

        1) 如果是不可查异常(unchecked exception),即Error、RuntimeException或它们的子类,那么可以不使用throws关键字来声明要抛出的异常,编译仍能顺利通过,但在运行时会被系统抛出。

        2)必须声明方法可抛出的任何可查异常(checked exception)。即如果一个方法可能出现受可查异常,要么用try-catch语句捕获,要么用throws子句声明将它抛出,否则会导致编译错误

        3)仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。当方法的调用者无力处理该异常的时候,应该继续抛出,而不是囫囵吞枣。

        4)调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。

    异常丢失


    如下代码会造成ExceptionB丢失

    public class NeverCaught {
        static void f() throws ExceptionB{
            throw new ExceptionB("exception b");
        }
     
        static void g() throws ExceptionC {
            try {
                f();
            } catch (ExceptionB e) {
                ExceptionC c = new ExceptionC("exception a");
                throw c;
            }
        }
     
        public static void main(String[] args) {
                try {
                    g();
                } catch (ExceptionC e) {
                    e.printStackTrace();
                }
        }
     
    }
    /*
    exception.ExceptionC
    at exception.NeverCaught.g(NeverCaught.java:12)
    at exception.NeverCaught.main(NeverCaught.java:19)
    */
    

      

    下述代码的红色部分,避免了ExceptionB 丢失的情况

    public class NeverCaught {
        static void f() throws ExceptionB{
            throw new ExceptionB("exception b");
        }
     
        static void g() throws ExceptionC {
            try {
                f();
            } catch (ExceptionB e) {
                ExceptionC c = new ExceptionC("exception a");
                //异常连
                c.initCause(e);
                throw c;
            }
        }
     
        public static void main(String[] args) {
                try {
                    g();
                } catch (ExceptionC e) {
                    e.printStackTrace();
                }
        }
     
    }
    /*
    exception.ExceptionC
    at exception.NeverCaught.g(NeverCaught.java:12)
    at exception.NeverCaught.main(NeverCaught.java:21)
    Caused by: exception.ExceptionB
    at exception.NeverCaught.f(NeverCaught.java:5)
    at exception.NeverCaught.g(NeverCaught.java:10)
    ... 1 more
    */
    

      

  • 相关阅读:
    浅尝辄止——在C++中调用C#的回调函数——COM方式
    代码管理——如何连接Git Server,下载代码
    浅尝辄止——使用ActiveX装载WPF控件
    软件调试——CPU异常列表
    软件调试——IA-32 保护模式下寄存器一览
    Delphi面向对象编程
    看雪2017CTF第二题解法
    串操作指令
    MASM 重复汇编
    MASM 宏结构
  • 原文地址:https://www.cnblogs.com/SamuelSun/p/4111655.html
Copyright © 2011-2022 走看看