ใช่ดังที่คนอื่น ๆ บอกว่าtry
บล็อกขัดขวางการเพิ่มประสิทธิภาพบางอย่างของ{}
ตัวละครที่อยู่รอบ ๆ โดยเฉพาะอย่างยิ่งเครื่องมือเพิ่มประสิทธิภาพจะต้องสมมติว่ามีข้อยกเว้นเกิดขึ้น ณ จุดใด ๆ ในบล็อกดังนั้นจึงไม่มีความมั่นใจว่าข้อความจะถูกดำเนินการ
ตัวอย่างเช่น:
try {
int x = a + b * c * d;
other stuff;
}
catch (something) {
....
}
int y = a + b * c * d;
use y somehow;
โดยไม่ต้องtry
มีค่าคำนวณเพื่อกำหนดให้x
จะถูกบันทึกไว้ว่าเป็น "subexpression ทั่วไป" y
และนำกลับมากำหนดให้ แต่เนื่องจากtry
ไม่มีการรับประกันว่าการแสดงออกครั้งแรกจะได้รับการประเมินดังนั้นการแสดงออกจะต้องคำนวณใหม่ นี่ไม่ใช่เรื่องใหญ่ในรหัส "เส้นตรง" แต่อาจมีความสำคัญในการวนซ้ำ
อย่างไรก็ตามควรสังเกตว่าสิ่งนี้ใช้ได้กับรหัส JITCed เท่านั้น javac ทำการเพิ่มประสิทธิภาพเพียงเล็กน้อยและไม่มีค่าใช้จ่ายใด ๆ กับล่าม bytecode เพื่อเข้า / ออกtry
บล็อก (ไม่มีรหัสไบต์สร้างขึ้นเพื่อทำเครื่องหมายขอบเขตบล็อก)
และสำหรับ bestsss:
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"