Lỗi trình biên dịch là do các quy tắc của ngôn ngữ không đưa ra một điểm rõ ràng về phạm vi khai báo biến của "mục".
Ví dụ, nếu tôi có một khối mã như thế này:
bool isTrue() {
bool returnValue = false;
if (cheese.isGreen()) {
returnValue = true;
}
return returnValue;
}
nó là đau đớn rõ ràng rằng returnValue là một biến có giá trị trên toàn bộ phương pháp.
Nếu tôi có một khối mã như thế này:
bool isTrue() {
if (cheese.isGreen()) {
bool returnValue = true;
}
return returnValue;
}
nó là đau đớn rõ ràng rằng returnValue không hợp lệ bên ngoài của "mệnh đề if".
Nhưng nếu tôi có một khối mã như thế này:
bool isTrue() {
if (cheese.isGreen())
bool returnValue = true;
return returnValue;
}
nó không phải là rõ ràng nếu returnValue là trong phạm vi của câu lệnh if hoặc nếu returnValue là trong phạm vi toàn bộ phương pháp. Điều này là do các chi tiết về cách bố trí ngữ pháp ngôn ngữ Java.Về cơ bản, nó được phép khai báo các biến mới trong bất kỳ khối nào (vì một khối xác định rõ phạm vi của biến) nhưng câu lệnh if này không chứa một khối.
Nếu bạn cho rằng Java thêm khối cho bạn một cách âm thầm, thì phạm vi nằm trong "khối bị lãng quên". Nếu bạn giả định rằng vì không có khối rõ ràng để chứa phạm vi, thì phạm vi của biến ở cùng mức với phần còn lại của phương thức. Các lập luận rất nhiều vì quan điểm đó là "chính xác hơn", vì vậy toàn bộ nỗ lực làm một điều như vậy đều bị cấm. Nếu điều này có vẻ kỳ quặc đối với bạn, và bạn chỉ thấy một người điên không cho rằng biến được định nghĩa trong phạm vi của một khối ngụ ý, hãy nhớ rằng có những ngôn ngữ trước Java, nơi phạm vi sẽ là ở cùng cấp với tuyên bố trả về. Vâng, các ngôn ngữ điên rồ theo tiêu chuẩn ngày nay, nhưng chúng vẫn tồn tại.
Nguồn
2010-03-27 05:26:04
+1 - ngữ pháp của Java đang ngăn lỗi lập trình. Xem: http://java.sun.com/docs/books/jls/second_edition/html/syntax.doc.html Điều này nêu bật tầm quan trọng của ngữ pháp được xác định rõ như Java. –