Evet, diğerlerinin söylediği gibi, bir try
blok {}
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, try
atamak için hesaplanan değer x
bir "ortak alt ifade" olarak kaydedilebilir ve atamak için yeniden kullanılabilir y
. Ancak try
ilk 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 try
blok 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.