Sí, como han dicho los demás, un try
bloque inhibe algunas optimizaciones en los {}
personajes que lo rodean. En particular, el optimizador debe asumir que podría ocurrir una excepción en cualquier punto dentro del bloque, por lo que no hay garantía de que las declaraciones se ejecuten.
Por ejemplo:
try {
int x = a + b * c * d;
other stuff;
}
catch (something) {
....
}
int y = a + b * c * d;
use y somehow;
Sin el try
, el valor calculado para asignar a x
podría guardarse como una "subexpresión común" y reutilizarse para asignar a y
. Pero debido a que try
no hay garantía de que la primera expresión haya sido evaluada, entonces la expresión debe ser recalculada. Esto no suele ser un gran problema en el código de "línea recta", pero puede ser significativo en un bucle.
Sin embargo, debe tenerse en cuenta que esto se aplica SOLO al código JITCed. javac solo realiza una pequeña cantidad de optimización, y el intérprete de bytecode tiene un costo cero para ingresar / salir de un try
bloque. (No se generan bytecodes para marcar los límites del bloque).
Y para bestsss:
public class TryFinally {
public static void main(String[] argv) throws Throwable {
try {
throw new Throwable();
}
finally {
System.out.println("Finally!");
}
}
}
Salida:
C:\JavaTools>java TryFinally
Finally!
Exception in thread "main" java.lang.Throwable
at TryFinally.main(TryFinally.java:4)
salida de 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
}
No "GOTO".