Trong Java, bạn phải khởi động các vars cục bộ. Điều này không được đảm bảo khi bạn có các khối catch này vì một ngoại lệ có thể được ném trước khi init var cục bộ trong khối try và bạn không khởi động var trong khối catch. Do đó, var cục bộ có thể không được khởi tạo sau khối try-catch-finally.
Khi bạn loại bỏ khối catch thì var được khởi tạo sau khi thử hoặc một ngoại lệ được ném và mã sau khi try-block không bao giờ được thực thi.
Bạn đã sau khả năng để sửa lỗi này:
- init var trước khi thử khối
- init var trong thử khối và bắt khối
- init var trong khối finally
- init chỉ var trong try-block, nhưng không bắt ngoại lệ
var cục bộ không được đảm bảo khởi tạo ngay cả khi var init là t điều đầu tiên bạn làm trong thử-block.Ví dụ, chuỗi được thực thi có thể được dừng lại với Thread.stop(Throwable)
sau khi nhập try-block nhưng trước var init. Khi điều này xảy ra thì var không được khởi tạo nhưng bắt cuối cùng được thực thi và đoạn mã sau khi try-catch-finally là tốt.
Dưới đây là một ví dụ cho thấy những gì tôi có nghĩa là:
public static void main(String[] args) throws InterruptedException {
Thread thread = new MyThread();
thread.start();
Thread.sleep(100);
thread.stop(new Exception());
}
private static class MyThread extends Thread {
@Override
public void run() {
int num = -1;
try {
Thread.sleep(600); //just to hit the thread at the right point
num = 100;
System.out.println("blub");
}
catch (Exception e) {
System.out.println("catch");
}
finally {
System.out.println("finally");
}
System.out.println(num);
System.out.println("after all");
}
}
Mã này in ra:
catch
finally
-1
after all
Nguồn
2012-01-05 10:30:24
Có liên quan, chắc chắn. :) –