zoukankan      html  css  js  c++  java
  • try、catch、finally用法总结(二)

    try、catch、finally用法总结:

      1、不管有没有异常,finally中的代码都会执行

      2、当try、catch中有return时,finally中的代码依然会继续执行

      3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。

      4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值

    执行顺序

    1.

      

     1     public static void main(String[] args) {
     2         // TODO Auto-generated method stub
     3         System.out.println(test());
     4     }
     5    public static int test(){
     6        int i = 1; 
     7        try{
     8            i++;
     9            System.out.println("try block, i = "+i);
    10        }catch(Exception e){
    11            i ++;
    12            System.out.println("catch block i = "+i);
    13        }finally{
    14            i = 10;
    15            System.out.println("finally block i = "+i);
    16        }
    17        return i;
    18    }

    结果输出如下:

        try block, i = 2

        finally block i = 10

        10

      先执行try块,并没有捕获到异常,finally  块,最后return。

    2.当我们把return放到try块中和catch块中,会怎么样呢?你们会不会纠结先return呢还是先finally呢?返回值i会改变吗?

     1 public static void main(String[] args) {
     2         // TODO Auto-generated method stub
     3         System.out.println(test());
     4     }
     5    public static int test(){
     6        int i = 1; 
     7        try{
     8            i++;
     9            System.out.println("try block, i = "+i);
    10            return i;
    11        }catch(Exception e){
    12            i ++;
    13            System.out.println("catch block i = "+i);
    14            return i;
    15        }finally{
    16            i = 10;
    17            System.out.println("finally block i = "+i);
    18        }
    19    }

    结果输出如下:

      try block, i = 2
      finally block i = 10
      2

    如我们总结一样:

       2、当try、catch中有return时,finally中的代码依然会继续执行

       3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。

    3.如果是操作不是基本类型会怎么样?会不一样吗?为什么?

     1     public static void main(String[] args) {
     2         // TODO Auto-generated method stub
     3         System.out.println(test().mmp("fuck"));
     4     }
     5    public static Person test(){
     6                Person person = new Person();
     7             try{
     8                 person.setShengao("172cm"+"---try block");
     9                 System.out.println("try block");
    10                 return person;
    11             }catch(Exception e){
    12                 person.setTizhong("100kg");
    13                 System.out.println("catch block");
    14                 return person;
    15             }finally{
    16                 person.setXingbie("女");
    17                 System.out.println("finally block ");
    18             }
    19    }

    Person类

     1 package xyz;
     2 
     3 public  class Person {
     4     public String shengao;
     5     public String tizhong;
     6     public String xingbie;
     7     
     8     //public String hello(String input);
     9     
    10     public String getShengao() {
    11         return shengao;
    12     }
    13 
    14     public void setShengao(String shengao) {
    15         this.shengao = shengao;
    16     }
    17 
    18     public String getTizhong() {
    19         return tizhong;
    20     }
    21 
    22     public void setTizhong(String tizhong) {
    23         this.tizhong = tizhong;
    24     }
    25 
    26     public String getXingbie() {
    27         return xingbie;
    28     }
    29 
    30     public void setXingbie(String xingbie) {
    31         this.xingbie = xingbie;
    32     }
    33 
    34 
    35     public String mmp(String fuck){
    36         System.out.println("person : mmp");
    37         System.out.println("shengao:"+this.shengao);
    38         System.out.println("tizhong:"+this.tizhong);
    39         System.out.println("xingbie:"+this.xingbie);
    40         return fuck;
    41     }
    42     
    43 }

    结果输出如下:

    try block
    finally block
    person : mmp
    shengao:172cm---try block
    tizhong:null
    xingbie:女
    fuck

        从上面可以看出,在finally中的set的性别 女  生效了,而在之前用基本类型,在finally中修改它的值不生效。为什么呢?

    我们知道基本类型在栈中存储,而对于非基本类型是存储在堆中的,返回的是堆中的地址,因此内容被改变了。

     4.如果在finally加入return,会怎么样? 如果在finally 抛出了异常呢?

     在finally中存在return,会有黄色警告:finally block does not complete normally   意思是finally代码块不能正常完成。

     就不贴代码了,有兴趣的自己试试吧。

                            《完》

    finally中有return 会出现警告finally block does not complete normally

  • 相关阅读:
    eclipse如何与git 配合工作。
    git托管代码(二)
    PPC2003 安装 CFNET 3.5成功
    我的Window Mobile WCF 項目 第三篇 WM窗体设计
    我的Window Mobile WCF 項目 第一篇Mobile开发和WinForm开发的区别
    我的Window Mobile WCF 項目 第七天
    我的Window Mobile WCF 項目 第二篇 WindowsMobile访问WCF
    WCF 用vs2010 和 vs2008的简单对比测试
    vs2010beta1 和 搜狗输入法 冲突,按下 Ctrl 键就报错,重装搜狗解决
    我的Window Mobile WCF 項目 第六天 (二)
  • 原文地址:https://www.cnblogs.com/oldthree3/p/9270541.html
Copyright © 2011-2022 走看看