天天看點

Java異常處理

  1.使用try、catch處理異常。

  2.認識異常繼承架構。

  3.認識throw、throws的使用時機

  4.運用finally關閉資源

  5.使用自動關閉資源文法

  6.AutoCloseable接口

一、try、catch處理異常

  Scanner console=newScanner(System.in);

  int number =console.nextInt();

  如果輸入不是整形的話會出現InputMismatchException。此時便可以用try catch來捕捉異常并做些處理。

二、異常處理架構

  完整的見JDK API

                     

Java異常處理

如果使用繼承時,父類的某個方法聲明throws某些異常,子類重新定義該方法時

  可以:

  1.不聲明throws任何異常

  2.throws父類該方法中的某些異常

  3.throws父類方法中聲明異常的子類

  但是不可以

  1.throws父類方法中未聲明的某些異常‘

  2.throws父類方法中聲明異常的父類

 關鍵字:

try:用來指定一塊預防所有異常的程式

catch:緊跟在try後面,用來捕獲異常

throw:用來明确的抛出一個異常

throws:用來标明一個成員函數可能抛出的各種異常

finally:確定一段代碼無論發生什麼異常都會被執行的一段代碼

四、使用finally關閉資源

  在下面代碼(1)中如果在close()之前出現異常那麼該方法就不執行了此時資源就沒有關閉是以使用(2)中的finally來使得該塊中的代碼一定被執行。注意如果程式中先

  return了finally的會先執行後傳回值。

Java異常處理
Java異常處理

(1)
public static String readFile(String name)throws FileNotFoundException{
        StringBuilder text=new StringBuilder();
        Scanner scanner=new Scanner(new FileInputStream(name));
        while(scanner.hasNext()){
            text.append('\n');
        }
        scanner.close();
        return text.toString();
    }
(2)
public static String readFile(String name)throws FileNotFoundException{
        StringBuilder text=new StringBuilder();
        Scanner scanner=null;
        try{
             scanner=new Scanner(new FileInputStream(name));
            while(scanner.hasNext()){
                text.append('\n');
            }
        }finally{
            if(scanner!=null){
            scanner.close();
            }
         }
        return text.toString();
    }
}      

View Code

五、使用自動關閉資源

  文法:try(自動關閉資源的對象){某塊代碼執行完之後執行關閉資源}//JDK之後新增的文法

Java異常處理
Java異常處理
try(Scanner scanner=new Scanner(new FileInputStream(name))){
            while(scanner.hasNext()){
                text.append('\n');
            }
        }      

  addSuppressed()方法,java.lang.throwable ,JDK7之後新增的方法,與之對應的是getSuppressed()傳回的是throwable[]代表先前加入的異常對象。

  主要流程是(1)先定義throwable對象tr1,(2)在可能發生異常的嘗試捕捉所有的錯誤Throwable 對象tr2,(3)在catch快中tr1=tr2抛出tr2;(4)若捕捉到錯誤則要進行資源關閉

        關閉資源可能發生錯誤得捕捉錯誤tr3,(5)把tr3在tr2中記錄在tr2中記錄如果沒有異常就直接關閉資源

    詳細代碼:

Java異常處理
Java異常處理
public static String readFile(String name)throws FileNotFoundException{
        StringBuilder text=new StringBuilder();
        Scanner scanner=new Scanner(new FileInputStream(name));
        Throwable localThrowable2=null;//定義throwable對象
        try{
            while(scanner.hasNext()){
                text.append('\n');
            }//捕捉異常塊
        }catch(Throwable localThrowable1 ){//嘗試捕捉所有的錯誤
            localThrowable2=localThrowable1;
            throw localThrowable1;
        }finally{
            if(scanner!=null){//判斷是否有參考到執行個體
                if(localThrowable2!=null){//如果前面有異常
                    try{
                        scanner.close();//嘗試關閉異常
                    }catch(Throwable x2){//萬一關閉異常出現錯誤
                        localThrowable2.addSuppressed(x2);//在原異常對象中記錄
                    }
                }
                else{
                    scanner.close();//沒有發生任何異常直接關閉
                }
            }
         }    
        return text.toString();
    }
}      

六、AutoCloseable接口

  JDK7.0新增的接口

  代碼如下

Java異常處理
Java異常處理
package Learn;
public interface AutoCloseable {
    void close()
            throws Exception;
}      

  操作AutoCloseable接口關閉資源,try中越後面的資源越早被關掉。為啥呢?見下面第二段代碼

Java異常處理
Java異常處理
package Learn;

public class AutoCloseableDemo {
    public static void main(String[] args) {
        try(ResourceSome some=new ResourceSome();ResourceOther other=new ResourceOther()){
            some.doSome();
            other.doOther();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
class ResourceSome implements AutoCloseable{
    void doSome(){
        System.out.println("some");
    }

    @Override
    public void close() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("someclosed");
    }
    
}
class ResourceOther implements AutoCloseable{
    public void doOther() {
        // TODO Auto-generated method stub
        System.out.println("other");
    }

    @Override
    public void close() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("otherclosed");
    }
    
}
結果如下
some
other
otherclosed
someclosed      
Java異常處理
Java異常處理
try{
            ResourceSome some=new ResourceSome();
            Throwable Throwable3=null;//定義throwable對象
            try{
                ResourceOther other=new ResourceOther();
                Throwable Throwable4=null;//定義throwable對象
                try{
                    some.doSome();
                    other.doOther();
                }catch(Throwable localThrowable1){
                    Throwable4=localThrowable1;
                    throw localThrowable1;
                    
                }finally{
                    
                        if(localThrowable4!=null){//如果前面有異常
                            try{
                                other.close();//嘗試關閉異常
                            }catch(Throwable x2){//萬一關閉異常出現錯誤
                                localThrowable4.addSuppressed(x2);//在原異常對象中記錄
                            }
                        }
                        else{
                            other.close();//沒有發生任何異常直接關閉
                        }
                    }
            }catch(Throwable localThrowable2){
                localThrowable3=localThrowable2;
                throw localThrowable2;
            }finally{
                if(localThrowable3!=null){//如果前面有異常
                    try{
                        some.close();//嘗試關閉異常
                    }catch(Throwable x2){//萬一關閉異常出現錯誤
                        localThrowable3.addSuppressed(x2);//在原異常對象中記錄
                    }
                }
                else{
                    some.close();//沒有發生任何異常直接關閉
                }
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
              

摘抄:

1、error和exception有什麼差別

error表示系統級的錯誤,是java運作環境内部錯誤或者硬體問題,不能指望程式來處理這樣的問題,除了退出運作外别無選擇,它是Java虛拟機抛出的。

exception 表示程式需要捕捉、需要處理的異常,是由與程式設計的不完善而出現的問題,程式必須處理的問題

2、運作時異常和一般異常有何不同

Java提供了兩類主要的異常:runtimeException和checkedException 

一般異常(checkedException):主要是指IO異常、SQL異常等。對于這種異常,JVM要求我們必須對其進行cathc處理,是以,面對這種異常,不管我們是否願

意,都是要寫一大堆的catch塊去處理可能出現的異常。

運作時異常(runtimeException):我們一般不處理,當出現這類異常的時候程式會由虛拟機接管。比如,我們從來沒有去處理過NullPointerException,而且

這個異常還是最常見的異常之一。

出現運作時異常的時候,程式會将異常一直向上抛,一直抛到遇到處理代碼,如果沒有catch塊進行處理,到了最上層,如果是多線程就有Thread.run()抛出,如

果不是多線程那麼就由main.run()抛出。抛出之後,如果是線程,那麼該線程也就終止了,如果是主程式,那麼該程式也就終止了。

其實運作時異常的也是繼承自Exception,也可以用catch塊對其處理,隻是我們一般不處理罷了,也就是說,如果不對運作時異常進行catch處理,那麼結果不

是線程退出就是主程式終止。

如果不想終止,那麼我們就必須捕獲所有可能出現的運作時異常。如果程式中出現了異常資料,但是它不影響下面的程式執行,那麼我們就該在catch塊裡面将異

常資料舍棄,然後記錄日志。如果,它影響到了下面的程式運作,那麼還是程式退出比較好些。

3、Java中異常處理機制的原理

Java通過面向對象的方式對異常進行處理,Java把異常按照不同的類型進行分類,并提供了良好的接口。在Java中,每個異常都是一個對象,它都是Throwable

或其子類的執行個體。當一個方法出現異常後就會抛出一個異常對象,該對象中包含有異常資訊,調用這個對象的方法可以捕獲到這個異常并對異常進行處理。Java的

異常處理是通過5個關鍵詞來實作的:try catch  throw throws finally。

一般情況下是用try來執行一段程式,如果出現異常,系統會抛出(throws),我們可以通過它的類型來捕捉它,或最後由預設處理器來處理它(finally)。

finally:確定一段代碼無論發生什麼異常都會被執行的一段代碼。

4、你平時在項目中是怎樣對異常進行處理的。

(1)盡量避免出現runtimeException 。例如對于可能出現空指針的代碼,帶使用對象之前一定要判斷一下該對象是否為空,必要的時候對runtimeException

也進行try catch處理。

(2)進行try catch處理的時候要在catch代碼塊中對異常資訊進行記錄,通過調用異常類的相關方法擷取到異常的相關資訊,傳回到web端,不僅要給使用者良好

的使用者體驗,也要能幫助程式員良好的定位異常出現的位置及原因。例如,以前做的一個項目,程式遇到異常頁面會顯示一個圖檔告訴使用者哪些操作導緻程式出現

了什麼異常,同時圖檔上有一個按鈕用來點選展示異常的詳細資訊給程式員看的。

5、final、finally、finalize的差別

(1)、final用于聲明變量、方法和類的,分别表示變量值不可變,方法不可覆寫,類不可以繼承

(2)、finally是異常進行中的一個關鍵字,表示finally{}裡面的代碼一定要執行

(3)、finalize是Object類的一個方法,在垃圾回收的時候會調用被回收對象的此方法。