Yap, seperti yang dikatakan orang lain, satu try
blok menghambat beberapa optimisasi di seluruh {}
karakter yang mengelilinginya. Secara khusus, pengoptimal harus mengasumsikan bahwa pengecualian dapat terjadi pada titik mana pun dalam blok, sehingga tidak ada jaminan bahwa pernyataan dieksekusi.
Sebagai contoh:
try {
int x = a + b * c * d;
other stuff;
}
catch (something) {
....
}
int y = a + b * c * d;
use y somehow;
Tanpa itu try
, nilai yang dihitung untuk x
ditugaskan dapat disimpan sebagai "subekspresi umum" dan digunakan kembali untuk ditugaskan y
. Tetapi karena try
tidak ada jaminan bahwa ekspresi pertama pernah dievaluasi, maka ekspresi tersebut harus dihitung ulang. Ini biasanya bukan masalah besar dalam kode "garis lurus", tetapi bisa signifikan dalam satu lingkaran.
Namun perlu dicatat bahwa ini HANYA berlaku untuk kode JITCed. javac hanya melakukan sejumlah optimasi piddling, dan tidak ada biaya untuk penerjemah bytecode untuk memasuki / meninggalkan try
blok. (Tidak ada bytecode yang dihasilkan untuk menandai batas blok.)
Dan untuk bestsss:
public class TryFinally {
public static void main(String[] argv) throws Throwable {
try {
throw new Throwable();
}
finally {
System.out.println("Finally!");
}
}
}
Keluaran:
C:\JavaTools>java TryFinally
Finally!
Exception in thread "main" java.lang.Throwable
at TryFinally.main(TryFinally.java:4)
output javap:
C:\JavaTools>javap -c TryFinally.class
Compiled from "TryFinally.java"
public class TryFinally {
public TryFinally();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]) throws java.lang.Throwable;
Code:
0: new #2 // class java/lang/Throwable
3: dup
4: invokespecial #3 // Method java/lang/Throwable."<init>":()V
7: athrow
8: astore_1
9: getstatic #4 // Field java/lang/System.out:Ljava/io/PrintStream;
12: ldc #5 // String Finally!
14: invokevirtual #6 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
17: aload_1
18: athrow
Exception table:
from to target type
0 9 8 any
}
Tidak ada "GOTO".