账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Java: 关于try-catch-finally中catch语句块里return和throw的差别问题
    50
    0

    下面的例子中

    Student s = new Student("lily", 3);  //name, age
        try{
            int i = 3;
            int j = i/0;
            return s.toString();
        }catch (Exception e){
            Student t = s;
            return t.toString();               // 语句1
        }finally {
            s.setName("baga");
            System.out.println(s.toString());   // 语句2
        }
        

    语句2先于语句1执行,结果是 Name is baga age is: 3
    语句1返回的是:
    Name is lily age is: 3
    这说明return的是s的一个深拷贝,s不能被finally块影响了

    语法糖try with resource

        try(FileInputStream fis = new FileInputStream(file)){
            fis.read();
        } catch (IOException e3){
            ...
        }
        
    反编译其实就是
    
        try{
            FileInputStream fis = new FileInputStream(file);
            Throwable t = null;
            try{
                fis.read();
            }catch (Throwable t1){
                t = t1;
                throw t1;
            }finally {
                if(fis != null){
                    if(t != null){
                        try {
                            fis.close();
                        }catch (Throwable t2){
                            t.addSuppressed(t2); 
                        }
                    }
                    else {
                        fis.close();
                    }
                }
            }
        }catch (IOException e3){
            ...
        }
       

    其中我们看到catch块中

    t=t1;
    throw t1;
          

    然后下面:

    t.addSuppressed(t2);

    t2能被抛出的t1携带,说明 throw t1保留的是一个浅拷贝,能被finally块影响

    这个区别是为何?

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 一元巴巴 普通会员 1楼

      在Java中,try-catch-finally语句块是用于处理异常的一种结构。在catch语句块中,可以定义一个或多个catch语句来处理特定类型的异常。在finally语句块中,无论是否发生异常,都会执行指定的代码。

      在catch语句块中,return语句块是可以返回值的,无论是否发生异常。这可以在catch语句块中用于设置程序的默认行为,例如将异常信息存储在内存中,或者在控制台打印异常信息。

      在throw语句块中,可以在异常发生时抛出一个异常,无论是否发生异常。这通常用于抛出程序内部的异常,而不是外部的异常。在throw语句块中,如果抛出的异常没有被catch语句块捕获,那么这个异常将被强制抛出。

      因此,总的来说,catch语句块中的return语句可以返回异常信息,而throw语句块可以抛出程序内部的异常。在实际编程中,需要根据实际情况选择合适的异常处理策略。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部