异常(一)

Exception(一)
一、什么是异常?
    异常是指程序在运行出现的错误,而不是我们在编译时出现的语法错误。
    
    Throwable继承树:
   
    
    异常类的继承关系:
    Object 类的直接子类Throwable描述了所有被虚拟机抛出的非正常状
    况。一般情况下很少用Throwable,而是使用它的两个子类Error、
    Exception。
    
    Error类指的是运行期间出现的严重错误。比如内存溢出,堆栈溢出。因为这类错误往往是毁灭性
    的,所以Error类就没必要使用异常处理机制来处理。
    而Exception类则是要使用异常处理机制来处理。
    
    Exception分为两大子类():
    1 以RuntimeException类为代表的非检查性异常。
    2 以IOException类为代表的的检查性异常。
    所谓的检查性是指编译器在编译时是否进行检查。如果编译器检查到你的代码中拥有检查性异常
    那么必须进行异常处理否则编译不通过,检查性异常类:往往是用来处理意外发生的,例如:网络
    中断,文件不存在,... 这些很平常又经常会发生的错误。对于这类错误我们就需要预先设置好处
    理机制,以防止异常的出现。
    
    而非检查性异常在编译时不检查,即使出错也会编译通过。非检查性异常类:往往是程序设计者的
    疏忽造成的,例如:数组越界,整数除以0,...这类异常往往进行测试时就能解决。
    
    
    对于异常类应该如何处理呢?
    对于不同的异常,java采用不同的异常处理方式:

    1 非检查性异常将由系统自动抛出,应用本身可以选择处理或者忽略该异常。

    2 对于方法中产生的Error,该异常一旦发生JVM将自行处理该异常,因此java允许应用不抛出此类异常。

    3 对于所有的检查性异常,必须进行捕获或者抛出该方法之外交给上层处理。也就是当一个方法存在异常时,
    要么使用try-catch捕获,要么使用该方法使用throws或者throw将该异常抛调用该方法的上层调用者。
    
    那么如何使用try-catch,throw,throws呢?
    请往下看:
    
二、如何处理异常(大多数情况下都是在处理检查型异常)?    
1 使用try-catch
    捕捉异常,然后处理异常
    try{
            int[] a={9};
            System.out.println(a[3]);
        }
        catch(ArrayIndexOutOfBoundsException e){//对异常进行捕获
            
            System.out.println("数组溢出");//对异常进行处理
            
        }
    注:因为异常的种类不知一个所以try后面可以跟数个catch。
        
2 使用throw
    抛出异常
    一般出现在函数体内部,用于抛出指定的异常。
    可以在一般方法内使用:
    public void function(){//判断两个字符串内容是否相等,不相等则抛出一个NumberFormatException异常
        String s="abc";
        string b="cba"
        if(s.equals(b)){
            System.out.println(s);
        }else{
            
            throw new NumberFormatException();
        }
    }
    也可以在try-catch中使用:
     try{
            int[] a={9};
            System.out.println(a[3]);
        }catch(ArrayIndexOutOfBoundsException e){
            throw e;
        }
        /*使用try catch捕获异常,但是不处理直接处理异常而是往上抛交给上一层
        的调用者来进行处理,可以说处理了但是处理的方法是将异常向上抛*/
    注意:throw必须声明的是Throwable或者是其子类
    例: throw new String("abc");会发生编译错误 ,因为String不是Throwable的子类
    
    
3 使用throws
    声明异常
    用于声明某个方法可能抛出的异常,然后上抛给上层调用它的程序处理
    public static void function() throws IOException,...{//声明函数可能出现的异常,如果出现则向上抛
        System.out.println("抛出了一个Exception");
        throw new IOException();//抛出异常,这个异常由它外围的throws是继续上抛
    }
    public static void main(String[] args) {
        try{
            function();//调用函数,但是函数出现了异常
        }catch(IOException e){//对异常进行捕获
            System.out.println("已经进行异常处理");//对异常的处理
        }
    }
    throws和throw的区别:
    1 throws说明这个地方可能会抛出某个异常,而throw则是指定这个地方会抛出指定异常(但是它们都是
     抛出没有处理异常,异常的处理由调用者来进行,而如果出现了一个意料之外的(throws没有声明的)
     异常,那么这个异常将会一直逐层上抛,直到交给JVM);
    2 throws出现在函数头部,throw出现在函数体内    ;
    
    
    最后一个内容:finally关键字
    finally的作用是无论是否捕获异常,finally内的代码都会执行。
    常用的地方是回收资源,当一个程序使用了本地的资源时,突然产生了异常,那么就会
    出现资源回收的问题,这时就要使用finally来回收资源了。
    try{
        ...
    }catch(Exception e){
        ...
    }finally{
        回收资源代码
    }
    注意:
    1 不要在finally子句中使用return语句,因为这样会造成真正的返回值被覆盖的错误。
    2 finally字句中千万不要抛出异常,否则整个try/catch块会抛出假异常(即finally
    子句中抛出的异常)

posted @ 2019-03-14 16:43  吴无物1997  阅读(126)  评论(0)    收藏  举报