Mat*_*ark 7 java return try-catch
我在一个小的静态方法中有一个try语句,对于我应该从哪里返回是否有最佳实践?
try {
mightThrow();
return true;
} catch (Exception e) {
return false;
}
Run Code Online (Sandbox Code Playgroud)
或之后,
try {
mightThrow();
} catch (Exception e) {
return false;
}
return true;
Run Code Online (Sandbox Code Playgroud)
从功能上讲,这些应该预先形成相同的,实际上是否存在字节码差异?性能方面,它们是完全相同的吗?
或者是一个优先于另一个?哪个以及为什么?
我没有听说过这个问题的实际最佳实践,但是你经常看到当方法使用过早返回时,返回true情况位于底部,例如
public bool canReadFile(path) {
if (!fileExists(path))
return false;
if (!fileIsReadable(file))
return false;
...
return true;
}
Run Code Online (Sandbox Code Playgroud)
因此,我建议您按照这种做法进行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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后编译它并检查字节码
$ 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
}
Run Code Online (Sandbox Code Playgroud)
那么性能差异是什么?虽然我没有测试,但我的赌注是没有任何明显的东西.最重要的是,这几乎不是您的应用程序的瓶颈.