2013-08-19 9 views
7
class For1 
{ 
    public static void main(String args[]) 
    { 
    int a = 0; 
    for(;;) 
    { 
     break; 
     System.out.println(a); //Line 1 
     ++a;//Line 2 
    } 
    } 
} 

Tôi biết rằng Dòng 1/Dòng 2 sẽ không bao giờ được thực thi. Nhưng tôi vẫn không hiểu tại sao một lỗi thời gian biên dịch lại bị ném. Tôi gặp phải lỗi biên dịch "không thể truy cập được".Lỗi biên dịch câu lệnh không thể truy cập được trong Java

Điều đó có nghĩa là trình biên dịch sẽ kiểm tra xem liệu trình biên dịch có thể biên dịch cho tất cả các chi nhánh/dòng mã không?

+0

Hãy xem tại địa chỉ: http://stackoverflow.com/questions/3795585/why-does-java-have-an- unreachable-statement-compiler-error – BobTheBuilder

Trả lời

5

Trình biên dịch cũng có thể đưa ra kết luận đó và giả sử bạn đang phạm sai lầm. Và có, trình biên dịch Java thực hiện một số lượng khá tốt của "Phân tích lưu lượng dữ liệu". Thông báo liên quan phổ biến nhất là thông báo về các biến không được khởi tạo. Thứ hai thường xuyên nhất là, tôi tin rằng, chính xác điều này, về mã không thể truy cập.

12

Điều đó có nghĩa là trình biên dịch sẽ kiểm tra xem liệu trình biên dịch có thể biên dịch cho tất cả các chi nhánh/dòng mã không?

Điều đó có nghĩa là trình biên dịch kiểm tra mọi câu lệnh có thể truy cập được.

Từ section 14.21 of the JLS:

Đó là một lỗi thời gian biên dịch nếu một tuyên bố không thể được thực hiện bởi vì nó là không thể truy cập.

Phần này được dành để giải thích chính xác từ "có thể truy cập". Ý tưởng là phải có một số đường dẫn thực hiện có thể từ đầu constructor, phương thức, initializer instance, hoặc initializer tĩnh có chứa câu lệnh cho chính câu lệnh đó. Phân tích tính đến cấu trúc của các câu lệnh.

Phần này sau đó ghi lại cách xác định khả năng hiển thị.

Đặc biệt, những điểm có liên quan trong trường hợp của bạn là:

Mỗi tuyên bố S khác trong một khối không có sản phẩm nào đó không phải là một khối chuyển đổi có thể truy cập khi và chỉ khi báo cáo kết quả trước S có thể hoàn thành bình thường.

A break, continue, return hoặc throw tuyên bố không thể hoàn thành bình thường.

Vì vậy, bạn "dòng 1" tuyên bố được đi trước bởi một tuyên bố (break;) mà không thể hoàn toàn bình thường, và do đó nó không thể truy cập.

0

Trình biên dịch sẽ kiểm tra xem có nhiều mã hơn sau một số từ khóa nhất định hay không. Một từ khóa khác sẽ gây ra thông báo tương tự là nếu bạn thay thế break theo return.

3

Điều đó có nghĩa là trình biên dịch sẽ kiểm tra xem liệu trình biên dịch có thể biên dịch cho tất cả các chi nhánh/dòng mã không?

Có trình biên dịch biên dịch toàn bộ mã và tạo mã byte theo mã của bạn, nó đủ thông minh hơn để phát hiện unreachable code cũng dead code.Ngay lập tức break trong các for-loop làm cho các tuyên bố khác không thể truy cập được.

for(;;){ 
    break; 
    ... // unreachable statement 
} 


int i=1; 
if(i==1) 
    ... 
else 
    ... // dead code 
1

Trình biên dịch có thể xác định rằng hai tuyên bố này sẽ không bao giờ được thực thi, và giúp bạn viết mã chính xác bằng cách từ chối để biên dịch nó, bởi vì điều này có 99,9% cơ hội trở thành một lỗi chứ không phải là một ý thức lựa chọn thêm câu lệnh sẽ không bao giờ được thực hiện.