Evet, diğerlerinin söylediği gibi, bir tryblok {}onu çevreleyen karakterler arasında bazı optimizasyonları engeller . Özellikle, optimizer, blok içinde herhangi bir noktada bir istisnanın olabileceğini varsaymalıdır, bu nedenle ifadelerin yürütüldüğüne dair bir güvence yoktur.
Örneğin:
try {
int x = a + b * c * d;
other stuff;
}
catch (something) {
....
}
int y = a + b * c * d;
use y somehow;
Öğesi olmadan, tryatamak için hesaplanan değer xbir "ortak alt ifade" olarak kaydedilebilir ve atamak için yeniden kullanılabilir y. Ancak tryilk ifadenin değerlendirildiğine dair bir güvence olmadığından, ifadenin yeniden hesaplanması gerekir. Bu genellikle "düz çizgi" kodunda çok önemli değildir, ancak bir döngüde önemli olabilir.
Ancak bunun SADECE JITCed kodu için geçerli olduğuna dikkat edilmelidir. Javac sadece bir miktar optimizasyon yapar ve bir tryblok girmek / bırakmak için bayt kodu yorumlayıcısının maliyeti sıfırdır . (Blok sınırlarını işaretlemek için oluşturulan bayt kodları yoktur.)
Ve bestsss için:
public class TryFinally {
public static void main(String[] argv) throws Throwable {
try {
throw new Throwable();
}
finally {
System.out.println("Finally!");
}
}
}
Çıktı:
C:\JavaTools>java TryFinally
Finally!
Exception in thread "main" java.lang.Throwable
at TryFinally.main(TryFinally.java:4)
javap çıkışı:
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
}
"GOTO" yok.