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代码块不能正常完成。

  • 相关阅读:
    Java中如何利用File类递归的遍历指定目录中的所有文件和文件夹
    SQL的别名和SQL的执行顺序和SQL优化
    Linux中如何配置sudo用户
    Linux的ssh的known_host文件
    Linux的SSH服务
    Linux的图形模式和文本模式以及单用户模式切换
    Linux服务器磁盘空间占满问题
    PLSQL Developer连接本地Oracle 11g数据库
    Linux常用命令学习
    OAuth2 .net MVC实现获取token
  • 原文地址:https://www.cnblogs.com/ygunoil/p/12935930.html
Copyright © 2011-2022 走看看