Trong C # và trong Java (và có thể cả các ngôn ngữ khác), các biến được khai báo trong khối "thử" không nằm trong phạm vi trong các khối "bắt" hoặc "cuối cùng" tương ứng. Ví dụ: đoạn mã sau không biên dịch:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Trong mã này, một lỗi thời gian biên dịch xảy ra trên tham chiếu đến s trong khối bắt, bởi vì s chỉ nằm trong phạm vi trong khối thử. (Trong Java, lỗi biên dịch là "không thể giải quyết được"; trong C #, đó là "Tên 's' không tồn tại trong ngữ cảnh hiện tại".)
Giải pháp chung cho vấn đề này dường như là thay vì khai báo các biến ngay trước khối thử, thay vì trong khối thử:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Tuy nhiên, ít nhất với tôi, (1) điều này cảm thấy giống như một giải pháp cồng kềnh và (2) nó dẫn đến các biến có phạm vi lớn hơn so với lập trình viên dự định (toàn bộ phần còn lại của phương thức, thay vì chỉ trong bối cảnh của thử-bắt-cuối cùng).
Câu hỏi của tôi là, những lý do / là lý do đằng sau quyết định thiết kế ngôn ngữ này (bằng Java, bằng C # và / hoặc trong bất kỳ ngôn ngữ áp dụng nào khác)?