हां, जैसा कि दूसरों ने कहा है, एक 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
ब्लॉक में प्रवेश करने / छोड़ने के लिए bytecode दुभाषिया की शून्य लागत है । (ब्लॉक सीमाओं को चिह्नित करने के लिए कोई बाइटकोड उत्पन्न नहीं किया गया है।)
और बेस्टसी के लिए:
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)
जावप आउटपुट:
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
}
कोई "गोटो" नहीं।