加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 在块中返回try块vs返回块

发布时间:2020-12-14 05:57:02 所属栏目:Java 来源:网络整理
导读:我在一个小的静态方法中有一个try语句,对于我应该从哪里返回是否有最佳实践? try { mightThrow(); return true;} catch (Exception e) { return false;} 或之后, try { mightThrow();} catch (Exception e) { return false;}return true; 从功能上讲,这些应
我在一个小的静态方法中有一个try语句,对于我应该从哪里返回是否有最佳实践?
try {
    mightThrow();
    return true;
} catch (Exception e) {
    return false;
}

或之后,

try {
    mightThrow();
} catch (Exception e) {
    return false;
}
return true;

从功能上讲,这些应该预先形成相同的,实际上是否存在字节码差异?性能方面,它们是完全相同的吗?

或者是一个优先于另一个?哪个以及为什么?

解决方法

我没有听说过这个问题的实际最佳实践,但是你经常看到当方法使用过早返回时,返回true的情况是在底部,例如
public bool canReadFile(path) {
  if (!fileExists(path))  
    return false;

  if (!fileIsReadable(file))
    return false;

  ...
  return true;
}

因此,我建议您按照这种做法进行try / catch块.它还可以更快地查看“预期”返回值是什么.

关于字节码,那么是的,确实存在差异.我做了一个快速的示例程序

class TryBlock {
    public static void main(String[] args) {
        a();
        b();
    }

    public static boolean a() {
        try {
            System.out.println("A");
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static boolean b() {
        try {
            System.out.println("B");
        } catch (Exception e) {
            return false;
        }
        return true;
    }

}

然后编译它并检查字节码

$javac TryBlock.java; javap -c TryBlock
Compiled from "TryBlock.java"
class TryBlock {
  TryBlock();
    Code:
       0: aload_0
       // Method java/lang/Object."<init>":()V
       1: invokespecial #1                  
       4: return

  public static void main(java.lang.String[]);
    Code:
       // Method a:()Z
       0: invokestatic  #2                  
       3: pop
       // Method b:()Z
       4: invokestatic  #3                  
       7: pop
       8: return

  public static boolean a();
    Code:
       // Field java/lang/System.out:Ljava/io/PrintStream;
       0: getstatic     #4                  
       // String A
       3: ldc           #5                  
       // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       5: invokevirtual #6                  
       8: iconst_1
       9: ireturn
      10: astore_0
      11: iconst_0
      12: ireturn
    Exception table:
       from    to  target type
           0     9    10   Class java/lang/Exception

  public static boolean b();
    Code:
       // Field java/lang/System.out:Ljava/io/PrintStream;
       0: getstatic     #4                  
       // String B
       3: ldc           #8                  
       // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       5: invokevirtual #6                  
       8: goto          14
      11: astore_0
      12: iconst_0
      13: ireturn
      14: iconst_1
      15: ireturn
    Exception table:
       from    to  target type
           0     8    11   Class java/lang/Exception
}

那么性能差异是什么?虽然我没有测试,但我的赌注是没有任何明显的东西.最重要的是,这几乎不是您的应用程序的瓶颈.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读