java异常处理之使用finally

时间:2021-07-19 18:23:59

一、关键技术点:
    1、关键字finally用在try和catch语句之后,表示无论是否发生异常,都会执行finally块中的代码
    2、一般情况下,先执行try块,如果有异常再执行catch块,最后才执行finally块,除非try块或者catch块中有跳转语句,如:return,那么在执行跳转语句之前,finally块中的代码被执行。因此,finally块中的代码一定会被执行。
    3、由于finally块中的代码肯定会执行,所以常常将关闭资源(如关闭文件、数据库连接等)的语句放在fianlly中。
    4、不要在finally块中用跳转语句,如return等,因为这会使得try和catch块中的跳转语句失效
   
二、演示实例

 

java异常处理之使用finallypackage book.exception;
java异常处理之使用finallyjava异常处理之使用finally
/**
java异常处理之使用finally * try catch finally的用法
java异常处理之使用finally * 无论是否发生异常,finally代码块始终都会执行
java异常处理之使用finally * 
@author joe
java异常处理之使用finally *
java异常处理之使用finally 
*/

java异常处理之使用finally
java异常处理之使用finallyjava异常处理之使用finally
public class Finally {
java异常处理之使用finally    
java异常处理之使用finallyjava异常处理之使用finally    
/**
java异常处理之使用finally     * 计算平方根
java异常处理之使用finally     * 
@param nStr    数字的字符串
java异常处理之使用finally     * 
@return    返回平方根
java异常处理之使用finally     * 
@throws MyFirstException    当输入字符串为空,或字符串不能转化成数字时,抛出该异常
java异常处理之使用finally     * 
@throws MySecondException    当输入字符串转化成的数字为负数时抛出该异常
java异常处理之使用finally     
*/

java异常处理之使用finallyjava异常处理之使用finally    
public static double getSqrt(String nStr) throws MyFirstException, MySecondException {
java异常处理之使用finallyjava异常处理之使用finally        
if (nStr == null{
java异常处理之使用finally            
throw new MyFirstException("输入的字符串不能为空!");
java异常处理之使用finally        }

java异常处理之使用finally        
double n = 0;
java异常处理之使用finallyjava异常处理之使用finally        
try {
java异常处理之使用finally            n 
= Double.parseDouble(nStr);
java异常处理之使用finallyjava异常处理之使用finally        }
 catch (NumberFormatException e) {
java异常处理之使用finally            
throw new MyFirstException("输入的字符串必须能够转化成数字!");
java异常处理之使用finally        }

java异常处理之使用finallyjava异常处理之使用finally        
if (n < 0{
java异常处理之使用finally            
throw new MySecondException("输入的字符串转化成的数字必须大于等于0!");
java异常处理之使用finally        }

java异常处理之使用finally        
return Math.sqrt(n);
java异常处理之使用finally    }

java异常处理之使用finally    
java异常处理之使用finallyjava异常处理之使用finally    
public static double testFinallyA(String nStr) {
java异常处理之使用finallyjava异常处理之使用finally        
try {
java异常处理之使用finally            System.out.println(
"Try block! ");
java异常处理之使用finally            
return getSqrt(nStr);
java异常处理之使用finallyjava异常处理之使用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异常处理之使用finallyjava异常处理之使用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异常处理之使用finallyjava异常处理之使用finally        }
 finally {
java异常处理之使用finally            System.out.println(
"Finally block!");
java异常处理之使用finally        }

java异常处理之使用finally    }

java异常处理之使用finally    
java异常处理之使用finally    
java异常处理之使用finallyjava异常处理之使用finally    
public static double testFinallyB(String nStr) {
java异常处理之使用finallyjava异常处理之使用finally        
try {
java异常处理之使用finally            System.out.println(
"Try block! ");
java异常处理之使用finally            
return getSqrt(nStr);
java异常处理之使用finallyjava异常处理之使用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异常处理之使用finallyjava异常处理之使用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异常处理之使用finallyjava异常处理之使用finally        }
 finally {
java异常处理之使用finally            System.out.println(
"Finally block!");
java异常处理之使用finally            
//增加一行,返回一个值
java异常处理之使用finally
            return 0;
java异常处理之使用finally        }

java异常处理之使用finally    }

java异常处理之使用finally    
java异常处理之使用finallyjava异常处理之使用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异常处理之使用finallyTry block
! 
java异常处理之使用finallyFinally block
!
java异常处理之使用finallyresult: 
11.108555261599053
java异常处理之使用finally发生异常时输出:
java异常处理之使用finallyTry block
! 
java异常处理之使用finallyCatch MyFirstException block
!
java异常处理之使用finallyException: 输入的字符串必须能够转化成数字!
java异常处理之使用finallyFinally block
!
java异常处理之使用finallyresult: 
-1.0
java异常处理之使用finally
java异常处理之使用finally使用testFinallyB方法:
java异常处理之使用finally没有发生异常是输出:
java异常处理之使用finallyTry block
! 
java异常处理之使用finallyFinally block
!
java异常处理之使用finallyresult: 
0.0
java异常处理之使用finally发生异常时输出:
java异常处理之使用finallyTry block
! 
java异常处理之使用finallyCatch MyFirstException block
!
java异常处理之使用finallyException: 输入的字符串必须能够转化成数字!
java异常处理之使用finallyFinally block
!
java异常处理之使用finallyresult: 
0.0

 

源码分析:
    着重看testFinallyB方法的输出,在testFinallyB方法中的finally块总使用了跳转语句"return 0"。因为finally块的语句在try和catch中的跳转语句执行之前被执行,在执行finally语句中的跳转语句后,将无法执行try和catch中的跳转语句。所以该方法总是返回0.