হ্যাঁ, অন্যরা যেমন বলেছে, একটি 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
সেখানে কোনও আশ্বাস নেই যে প্রথম অভিব্যক্তিটি কখনও মূল্যায়ন করা হয়েছিল, তাই প্রকাশটি পুনরায় সংশোধন করতে হবে। এটি "স্ট্রেইট-লাইন" কোডে সাধারণত কোনও বড় বিষয় নয়, তবে একটি লুপে তাৎপর্যপূর্ণ হতে পারে।
তবে এটি লক্ষ করা উচিত যে এটি কেবলমাত্র জাইটিসিড কোডে প্রযোজ্য। জাভাক কেবলমাত্র একটি চমকপ্রদ পরিমাণ অপ্টিমাইজেশন করে এবং কোনও 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)
জাভাপ আউটপুট:
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
}
"গোটো" নেই।