2013-08-13 18 views

Trả lời

25

Trở về từ bên trong một khối finally sẽ gây ra exceptions bị mất.

Một câu lệnh trả về trong khối cuối cùng sẽ gây ra bất kỳ ngoại lệ nào có thể được ném vào khối thử hoặc bắt được bỏ đi.

Theo Java Language Specification:

Nếu thực hiện các khối try hoàn đột ngột đối với bất kỳ lý do nào khác R, sau đó khối cuối cùng được thực thi, và sau đó là một sự lựa chọn:

If the finally block completes normally, then the try statement 
    completes abruptly for reason R. 

    If the finally block completes abruptly for reason S, then the try 
    statement completes abruptly for reason S (and reason R is 
    discarded). 

Lưu ý: Theo JLS 14.17 - câu lệnh trả về luôn hoàn thành đột ngột.

+0

Trích dẫn JLS không hỗ trợ khiếu nại của bạn về tuyên bố trả lại bên trong khối cuối cùng? – linski

+0

Những dòng này từ JLS là ngoại lệ nhưng những điều này cũng đúng đối với câu lệnh trả về. –

+0

Tôi vẫn không nhận được mối quan hệ giữa báo giá và tuyên bố của bạn - vì vậy tôi đã viết [một đoạn mã] (http://ideone.com/1GaeBo) cho thấy rằng, khi khối cuối cùng chứa câu lệnh trả về, các trường hợp ngoại lệ được ném từ khối đánh bắt được ăn, nhưng những người ném từ khối thử bị bắt. Xin vui lòng xác minh. – linski

10

Có, bạn có thể viết câu lệnh return trong khối cuối cùng và nó sẽ ghi đè lên giá trị trả lại khác.

EDIT:
Ví dụ trong mã dưới đây

public class Test { 

    public static int test(int i) { 
     try { 
      if (i == 0) 
       throw new Exception(); 
      return 0; 
     } catch (Exception e) { 
      return 1; 
     } finally { 
      return 2; 
     } 
    } 

    public static void main(String[] args) { 
     System.out.println(test(0)); 
     System.out.println(test(1)); 
    } 
} 

Sản lượng luôn là 2, như chúng tôi đang trở về 2 từ khối finally. Hãy nhớ rằng cuối cùng luôn luôn thực hiện cho dù có một ngoại lệ hay không. Vì vậy, khi khối cuối cùng chạy nó sẽ ghi đè giá trị trả về của người khác. Viết báo cáo trả về trong khối cuối cùng là không cần thiết, trên thực tế bạn không nên viết nó.

+0

bạn có thể giải thích không? –

+0

thử {ném ngoại lệ mới(); } catch {throws new exception();} cuối cùng {return 5; } Đây là gì happends ??? –

+0

Vui lòng xem Chỉnh sửa – Krushna

1

Bạn có thể viết return tuyên bố trong finally khối nhưng giá trị trả về từ try khối sẽ được cập nhật trên stack và không phải là giá trị trả về finally khối.

Chúng ta hãy nói rằng bạn có chức năng này

private Integer getnumber(){ 
Integer i = null; 
try{ 
    i = new Integer(5); 
    return i; 
}catch(Exception e){return 0;} 
finally{ 
    i = new Integer(7); 
    System.out.println(i); 
} 
} 

và bạn đang gọi này từ phương pháp chính

public static void main(String[] args){ 
    System.out.println(getNumber()); 
} 

này in

7 
5 
2

Có thể, nhưng bạn không nên 1, bởi vì the finally block có nghĩa là cho một mục đích đặc biệt.

cuối cùng là hữu ích cho nhiều hơn là chỉ xử lý ngoại lệ - nó cho phép lập trình viên tránh mã dọn dẹp vô tình bị bỏ qua bằng cách trả lại, tiếp tục hoặc ngắt. Việc đặt mã dọn dẹp trong một khối cuối cùng luôn là một thực hành tốt, ngay cả khi không có ngoại lệ nào được dự đoán.

Không nên viết logic trong đó.

+0

Điều này không thực sự giải thích nhiều. Câu trả lời của TJ Crowder ở đây tốt hơn nhiều - https://stackoverflow.com/questions/15225819/try-catch-finally-return-clarification –

+0

@BoratSagdiyev Nếu nó quá chi tiết .. hãy đi và đọc về nó. Cảm ơn –

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