天天看點

java異常處理之使用finally

一、關鍵技術點:

    1、關鍵字finally用在try和catch語句之後,表示無論是否發生異常,都會執行finally塊中的代碼

    2、一般情況下,先執行try塊,如果有異常再執行catch塊,最後才執行finally塊,除非try塊或者catch塊中有跳轉語句,如:return,那麼在執行跳轉語句之前,finally塊中的代碼被執行。是以,finally塊中的代碼一定會被執行。

    3、由于finally塊中的代碼肯定會執行,是以常常将關閉資源(如關閉檔案、資料庫連接配接等)的語句放在fianlly中。

    4、不要在finally塊中用跳轉語句,如return等,因為這會使得try和catch塊中的跳轉語句失效

二、示範執行個體

java異常處理之使用finally

package  book.exception;

java異常處理之使用finally
java異常處理之使用finally
java異常處理之使用finally
java異常處理之使用finally
java異常處理之使用finally

public   class  Finally  ... {

java異常處理之使用finally
java異常處理之使用finally
java異常處理之使用finally
java異常處理之使用finally
java異常處理之使用finally

    public static double getSqrt(String nStr) throws MyFirstException, MySecondException ...{

java異常處理之使用finally
java異常處理之使用finally

        if (nStr == null) ...{

java異常處理之使用finally

            throw new MyFirstException("輸入的字元串不能為空!");

java異常處理之使用finally

        }

java異常處理之使用finally

        double n = 0;

java異常處理之使用finally
java異常處理之使用finally

        try ...{

java異常處理之使用finally

            n = Double.parseDouble(nStr);

java異常處理之使用finally
java異常處理之使用finally

        } catch (NumberFormatException e) ...{

java異常處理之使用finally

            throw new MyFirstException("輸入的字元串必須能夠轉化成數字!");

java異常處理之使用finally

        }

java異常處理之使用finally
java異常處理之使用finally

        if (n < 0) ...{

java異常處理之使用finally

            throw new MySecondException("輸入的字元串轉化成的數字必須大于等于0!");

java異常處理之使用finally

        }

java異常處理之使用finally

        return Math.sqrt(n);

java異常處理之使用finally

    }

java異常處理之使用finally
java異常處理之使用finally
java異常處理之使用finally

    public static double testFinallyA(String nStr) ...{

java異常處理之使用finally
java異常處理之使用finally

        try ...{

java異常處理之使用finally

            System.out.println("Try block! ");

java異常處理之使用finally

            return getSqrt(nStr);

java異常處理之使用finally
java異常處理之使用finally

        } catch (MyFirstException e1) ...{

java異常處理之使用finally

            System.out.println("Catch MyFirstException block!");

java異常處理之使用finally

            System.out.println("Exception: " + e1.getMessage());

java異常處理之使用finally

            return -1;

java異常處理之使用finally
java異常處理之使用finally

        } catch (MySecondException e2) ...{

java異常處理之使用finally

            System.out.println("Catch MySecondException block!");

java異常處理之使用finally

            System.out.println("Exception: " + e2.getMessage());

java異常處理之使用finally

            return -2;

java異常處理之使用finally
java異常處理之使用finally

        } finally ...{

java異常處理之使用finally

            System.out.println("Finally block!");

java異常處理之使用finally

        }

java異常處理之使用finally

    }

java異常處理之使用finally
java異常處理之使用finally
java異常處理之使用finally
java異常處理之使用finally

    public static double testFinallyB(String nStr) ...{

java異常處理之使用finally
java異常處理之使用finally

        try ...{

java異常處理之使用finally

            System.out.println("Try block! ");

java異常處理之使用finally

            return getSqrt(nStr);

java異常處理之使用finally
java異常處理之使用finally

        } catch (MyFirstException e1) ...{

java異常處理之使用finally

            System.out.println("Catch MyFirstException block!");

java異常處理之使用finally

            System.out.println("Exception: " + e1.getMessage());

java異常處理之使用finally

            return -1;

java異常處理之使用finally
java異常處理之使用finally

        } catch (MySecondException e2) ...{

java異常處理之使用finally

            System.out.println("Catch MySecondException block!");

java異常處理之使用finally

            System.out.println("Exception: " + e2.getMessage());

java異常處理之使用finally

            return -2;

java異常處理之使用finally
java異常處理之使用finally

        } finally ...{

java異常處理之使用finally

            System.out.println("Finally block!");

java異常處理之使用finally

            //增加一行,傳回一個值

java異常處理之使用finally

            return 0;

java異常處理之使用finally

        }

java異常處理之使用finally

    }

java異常處理之使用finally
java異常處理之使用finally
java異常處理之使用finally

    public static void main(String[] args) ...{

java異常處理之使用finally

        System.out.println("使用testFinallyA方法:");

java異常處理之使用finally

        System.out.println("沒有發生異常是輸出:");

java異常處理之使用finally

        System.out.println("result: " + Finally.testFinallyA("123.4"));

java異常處理之使用finally

        System.out.println("發生異常時輸出:");

java異常處理之使用finally

        System.out.println("result: " + Finally.testFinallyA("dfdg"));

java異常處理之使用finally

        System.out.println();

java異常處理之使用finally

        System.out.println("使用testFinallyB方法:");

java異常處理之使用finally

        System.out.println("沒有發生異常是輸出:");

java異常處理之使用finally

        System.out.println("result: " + Finally.testFinallyB("123.4"));

java異常處理之使用finally

        System.out.println("發生異常時輸出:");

java異常處理之使用finally

        System.out.println("result: " + Finally.testFinallyB("dfdg"));

java異常處理之使用finally

    }

java異常處理之使用finally
java異常處理之使用finally

}

 程式輸出:

java異常處理之使用finally

使用testFinallyA方法:

java異常處理之使用finally

沒有發生異常是輸出:

java異常處理之使用finally

Try block !  

java異常處理之使用finally

Finally block !

java異常處理之使用finally

result:  11.108555261599053

java異常處理之使用finally

發生異常時輸出:

java異常處理之使用finally

Try block !  

java異常處理之使用finally

Catch MyFirstException block !

java異常處理之使用finally

Exception: 輸入的字元串必須能夠轉化成數字!

java異常處理之使用finally

Finally block !

java異常處理之使用finally

result:  - 1.0

java異常處理之使用finally
java異常處理之使用finally

使用testFinallyB方法:

java異常處理之使用finally

沒有發生異常是輸出:

java異常處理之使用finally

Try block !  

java異常處理之使用finally

Finally block !

java異常處理之使用finally

result:  0.0

java異常處理之使用finally

發生異常時輸出:

java異常處理之使用finally

Try block !  

java異常處理之使用finally

Catch MyFirstException block !

java異常處理之使用finally

Exception: 輸入的字元串必須能夠轉化成數字!

java異常處理之使用finally

Finally block !

java異常處理之使用finally

result:  0.0

源碼分析:

    着重看testFinallyB方法的輸出,在testFinallyB方法中的finally塊總使用了跳轉語句"return 0"。因為finally塊的語句在try和catch中的跳轉語句執行之前被執行,在執行finally語句中的跳轉語句後,将無法執行try和catch中的跳轉語句。是以該方法總是傳回0.