그러나 다른 사람들이 말했듯이 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
첫 번째 표현이 평가되었다는 보장이 없기 때문에 표현을 다시 계산해야합니다. 이것은 일반적으로 "직선"코드에서 큰 문제는 아니지만 루프에서 중요 할 수 있습니다.
그러나 이는 JITC 코드에만 적용됩니다. 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
}
"GOTO"가 없습니다.