我在一个小的静态方法中有一个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 }
那么性能差异是什么?虽然我没有测试,但我的赌注是没有任何明显的东西.最重要的是,这几乎不是您的应用程序的瓶颈.