Ja, wie die anderen gesagt haben, verhindert ein try
Block einige Optimierungen in den ihn {}
umgebenden Zeichen. Insbesondere muss der Optimierer davon ausgehen, dass an jedem Punkt innerhalb des Blocks eine Ausnahme auftreten kann, sodass nicht garantiert werden kann, dass Anweisungen ausgeführt werden.
Beispielsweise:
try {
int x = a + b * c * d;
other stuff;
}
catch (something) {
....
}
int y = a + b * c * d;
use y somehow;
Ohne das könnte try
der Wert, dem die Zuweisung berechnet wurde, x
als "allgemeiner Unterausdruck" gespeichert und zur Zuweisung wiederverwendet werden y
. Aufgrund der try
Tatsache, dass es keine Garantie dafür gibt, dass der erste Ausdruck jemals ausgewertet wurde, muss der Ausdruck neu berechnet werden. Dies ist normalerweise keine große Sache im "geradlinigen" Code, kann aber in einer Schleife von Bedeutung sein.
Es ist jedoch zu beachten, dass dies NUR für JITCed-Code gilt. javac führt nur eine geringfügige Optimierung durch, und der Bytecode-Interpreter hat keine Kosten für das Betreten / Verlassen eines try
Blocks. (Es werden keine Bytecodes generiert, um die Blockgrenzen zu markieren.)
Und für Bests:
public class TryFinally {
public static void main(String[] argv) throws Throwable {
try {
throw new Throwable();
}
finally {
System.out.println("Finally!");
}
}
}
Ausgabe:
C:\JavaTools>java TryFinally
Finally!
Exception in thread "main" java.lang.Throwable
at TryFinally.main(TryFinally.java:4)
Javap-Ausgabe:
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
}
Kein "GOTO".