Oui, comme les autres l'ont dit, un try
bloc inhibe certaines optimisations sur les {}
personnages qui l'entourent. En particulier, l'optimiseur doit supposer qu'une exception peut se produire à tout moment dans le bloc, il n'y a donc aucune garantie que les instructions seront exécutées.
Par exemple:
try {
int x = a + b * c * d;
other stuff;
}
catch (something) {
....
}
int y = a + b * c * d;
use y somehow;
Sans le try
, la valeur calculée à attribuer x
pourrait être enregistrée en tant que "sous-expression commune" et réutilisée pour être affectée y
. Mais à cause de la, try
il n'y a aucune garantie que la première expression ait jamais été évaluée, donc l'expression doit être recalculée. Ce n'est généralement pas un gros problème dans le code «en ligne droite», mais cela peut être significatif dans une boucle.
Il convient de noter, cependant, que cela s'applique UNIQUEMENT au code JITCed. javac n'effectue qu'une quantité impressionnante d'optimisation, et il n'y a aucun coût pour l'interpréteur de bytecode pour entrer / quitter un try
bloc. (Aucun bytecode n'est généré pour marquer les limites du bloc.)
Et pour les meilleurs:
public class TryFinally {
public static void main(String[] argv) throws Throwable {
try {
throw new Throwable();
}
finally {
System.out.println("Finally!");
}
}
}
Production:
C:\JavaTools>java TryFinally
Finally!
Exception in thread "main" java.lang.Throwable
at TryFinally.main(TryFinally.java:4)
sortie 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
}
Pas de "GOTO".