2010-12-30 40 views
7

Tại sao phương pháp này (thử nghiệm) cần một giá trị trả về (nó luôn luôn đúng)?Tại sao phương thức yêu cầu giá trị trả lại sau câu lệnh luôn trả về đúng?

public boolean test() { //This method must return a result of type boolean 
    if (true) { 
     return true; // always return true 
    } 
} 

và khi tôi giá trị gia tăng trở lại, nó cảnh báo như "mã Chết". Vì vậy, tại sao không chấp nhận phương thức test() đầu tiên

public boolean test(int i) { 
    if (true) { 
     return true; 
    } else { //Dead code 
     return false; 
    } 
} 
+3

Nếu một tuyên bố luôn đi đến mức khó tin, có thể bạn không chỉ cần loại bỏ các tuyên bố hoàn toàn? –

+0

nó chỉ là thử nghiệm.Tôi không có bất kỳ phương pháp nào luôn trả về true :) –

+3

Vì vậy, nó không phải lúc nào cũng đúng, vì vậy có nhiều hơn một đường dẫn thông qua mã, do đó bạn cần một câu lệnh trả về cho mỗi đường dẫn –

Trả lời

11

Phân tích trả về phương thức không phân tích điều kiện if để xem liệu nó có đúng hay sai, vì thông thường nó sẽ không phải là hằng số biên dịch (nếu không bạn sẽ không viết if ở vị trí đầu tiên). Nó chỉ đơn giản thấy rằng có một if mà có thể hoặc không thể được thực hiện, và nếu nó không được thực hiện thì phương pháp không trả về một giá trị, do đó lỗi.

Phân tích mã chết được thực hiện theo một cách riêng biệt cho phương pháp phân tích trả về phương pháp, một số phân tích chuyên sâu hơn trong các điều kiện chi nhánh.

Đoán hoàn toàn không được hiểu rõ của tôi là hành vi này là một tạo tác của trình biên dịch được phát triển như thế nào; phân tích trả về phương thức là một phần quan trọng trong việc biên dịch, để đảm bảo bạn có được một chương trình hợp lệ ở cuối, và do đó là một trong những tính năng cốt lõi được triển khai trước tiên. Phân tích mã chết là một 'tốt đẹp để có' và do đó đã được thực hiện sau này, sử dụng các thuật toán phức tạp hơn (như các bit biên dịch lõi đã được hoàn thành bởi giai đoạn đó)

+0

+1 để chỉ ra rằng trình biên dịch sẽ không đánh giá nếu điều kiện – Babar

2

Đó là kết quả của độ sâu của trình biên dịch.

1

Phương pháp này không làm bất cứ điều gì, vì vậy, nó là mã chết. Nếu phương thức luôn trả về đúng, bạn không cần phải gọi nó, chỉ cần sử dụng true.

+0

nó chỉ là thử nghiệm. Tôi không có bất kỳ phương pháp nào luôn trả về true :) –

+1

@hilal, Trình biên dịch cố gắng phát hiện các lỗi phổ biến, nó không cố gắng xử lý tất cả các trường hợp lý thuyết có thể và cố gắng suy ra những gì bạn có thể muốn xảy ra. –

1

Trong Java, nếu bạn chỉ định kiểu trả về (boolean), bạn phải chỉ định rõ ràng giá trị, bất kể giá trị đó luôn giống nhau. Điều đó làm tăng câu hỏi: nếu nó luôn luôn giống nhau, tại sao trả lại bất cứ điều gì? Bạn đã biết câu trả lời trong mã gọi.

Tại sao không chỉ cần viết:

public boolean test() { 
    return true; 
} 

Đối với phần thứ hai của câu hỏi của bạn, trình biên dịch thấy rằng con đường thứ hai là không bao giờ được thực hiện trong câu lệnh if và mang đến cho bạn một cảnh báo về điều đó.

0

Nếu bạn kiểm tra điều gì đó, đó có thể là giá trị hoặc giá trị khác. Vì vậy, bạn không thể đảm bảo rằng sẽ có được bên trong tuyên bố nếu.

if (someBoolean){ 
    return true; 
} 

sẽ không hoạt động gây ra một sốBoolean có thể đúng hoặc sai. Nếu phương pháp của bạn phải trả về một cái gì đó và someBoolean là sai, nó sẽ không trả lại bất cứ điều gì. Vì vậy, trong trường hợp này, bạn có thể làm:

if (someBoolean){ 
    return true; 
} 

trả về false;

hoặc đơn giản là

return someBoolean; 
Các vấn đề liên quan