天天看点

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.