2013-05-08 24 views
14

tôi gần đây đã được loại bỏ một khối mã từ cơ sở mã của chúng tôi trước khi phát hành và sử dụng một if (false) tuyên bố để ngăn chặn thực hiện:Trong khi (false) gây ra tuyên bố unreachable lỗi biên dịch

if (false) { 
    ArrayList<String> list = new ArrayList<String>(); 
    ... 
} 

này biên dịch tốt và sẽ ngăn chặn việc thực thi khối mã vi phạm (đúng hay sai, đó không phải là đối số hiện tại).

Tuy nhiên, loại một cách tình cờ, tôi đã thay đổi khối ở trên để:

while (false) { 
    ArrayList<String> list = new ArrayList<String>(); 
    ... 
} 

và nhận được một lỗi tuyên bố biên soạn không thể truy cập.

Tôi đánh giá cao lỗi biên dịch và hiểu lý do, tuy nhiên, tôi đang đấu tranh để hiểu sự khác biệt giữa hai khối và lý do tại sao trước đây biên dịch tốt nhưng sau đó không có khi cả hai đều có báo cáo không thể truy cập.

+0

Tôi đoán là dễ mắc lỗi hơn khi liên kết 'do-while' so với' if'. Đó là lý do tại sao trường hợp thứ hai dẫn đến lỗi. – Renan

+0

Đoán của tôi là ý định ban đầu của tác giả biên dịch là cả hai đều gây ra lỗi không thể truy cập được. Tuy nhiên, bởi vì thực hành lập trình có những người thường tắt mã với if (false), cho phép nó như là một trường hợp đặc biệt. – CBass

Trả lời

12

Trong cả hai trường hợp trình biên dịch nên nâng cao một lỗi, vì mã giữa niềng răng về cơ bản là vô nghĩa, nhưngif (false) đã được giữ trong Java để mô phỏng C/C++ Preprocessor #if 0, khá một cách phổ biến của việc vô hiệu hóa các phần của mã để thử nghiệm hoặc gỡ lỗi.

EDIT: để tham khảo, "biên dịch có điều kiện" được mô tả chi tiết ở cuối chapter 14.21 của Đặc tả ngôn ngữ Java.

+1

Trên thực tế, việc lập trình vô hiệu hóa mã với if (false) có trước sự ra đời của C/C++ bằng một shot dài. – CBass

+1

Công bằng. Nhưng không phải là phần lỗi 'không thể truy cập được '. Các kiến ​​trúc sư Java nên đã quyết định: hoặc báo cáo cả hai là mã chết tại thời gian biên dịch hoặc không có. Ít nhất, họ nên sử dụng một cú pháp khác, đơn giản để mô phỏng '#if 0'. Ví dụ, 'disabled {}' hoặc một cái gì đó tương tự. –

+0

Có, tôi đồng ý. Như tôi đã nhận xét ở trên, tôi đặt cược ban đầu cả hai đã gây ra lỗi và sau đó họ undid nó cho nếu (false) bởi vì các lập trình ghét nó. Đây sẽ là một câu hỏi tốt để gửi cho James Gosling. – CBass

1

"Java sử dụng thuật toán phân tích lưu lượng đơn giản để tìm các trường hợp phổ biến nhất của mã không thể truy cập và tất cả các khối mã không truy cập được sẽ bị gắn cờ là lỗi biên dịch. Đó là lý do tại sao" while (false) {...} "của bạn Tuy nhiên, Java đưa ra một ngoại lệ đặc biệt cho "if (false) {...}", bởi vì các lập trình viên thường sử dụng cấu trúc này trong quá trình phát triển để tạm thời vô hiệu hóa một phần của chương trình. tuyên bố này.

Nếu bạn quan tâm đến chi tiết nitty-gritty, hãy tham khảo mô tả về các tuyên bố không thể truy cập được của Ngôn ngữ Java @http://docs.oracle.com/javase/specs/#14.21 ".

Trích dẫn từ http://www.coderanch.com/t/266678/java-programmer-SCJP/certification/false-false

Các vấn đề liên quan