Так, як говорили інші, try
блок гальмує деякі оптимізації для {}
персонажів, що його оточують. Зокрема, оптимізатор повинен припускати, що виняток може статися в будь-якій точці блоку, тому немає впевненості, що оператори виконуються.
Наприклад:
try {
int x = a + b * c * d;
other stuff;
}
catch (something) {
....
}
int y = a + b * c * d;
use y somehow;
Без цього try
значення, обчислене для присвоєння, можна x
було б зберегти як "загальний піддекспресія" і повторно використовувати для призначення y
. Але через try
відсутність впевненості, що перший вираз колись оцінювали, тому вираз потрібно перерахувати. Зазвичай це не велика справа у прямолінійному коді, але може бути значним у циклі.
Слід зазначити, що це стосується ТОЛЬКО до коду JITCed. javac робить лише дивовижну кількість оптимізації, і для інтерпретатора байт-коду для введення / виходу з try
блоку немає нульової вартості . (Немає байткодових кодів, створених для позначення меж блоку.)
І для кращих результатів:
public class TryFinally {
public static void main(String[] argv) throws Throwable {
try {
throw new Throwable();
}
finally {
System.out.println("Finally!");
}
}
}
Вихід:
C:\JavaTools>java TryFinally
Finally!
Exception in thread "main" java.lang.Throwable
at TryFinally.main(TryFinally.java:4)
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
}
Ні «ГОТО».