Chúng tôi có thể sử dụng báo cáo trả lại trong cuối cùng là khối hay không. Điều này có thể gây ra bất kỳ vấn đề nào không?Chúng tôi có thể sử dụng "trả lại" cuối cùng là chặn
Trả lời
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.
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
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ề. –
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
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ó.
bạn có thể giải thích không? –
thử {ném ngoại lệ mới(); } catch {throws new exception();} cuối cùng {return 5; } Đây là gì happends ??? –
Vui lòng xem Chỉnh sửa – Krushna
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
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 đó.
Đ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 –
@BoratSagdiyev Nếu nó quá chi tiết .. hãy đi và đọc về nó. Cảm ơn –
- 1. Tôi có cần sử dụng luôn targetSdkVersion cuối cùng không?
- 2. Phương pháp cuối cùng có thể sử dụng Powermockito trong lớp bê tông không cuối cùng?
- 3. Sử dụng câu lệnh và try-catch() - cuối cùng là lặp lại?
- 4. Đó là nhanh hơn - Một Sử dụng chặn hoặc try/catch/Cuối cùng
- 5. Tại sao không thể "trả lại" và "trả lại lợi nhuận" được sử dụng trong cùng một phương pháp?
- 6. Khi nào tôi nên sử dụng cuối cùng-block trong Java try-catch-cuối cùng
- 7. Chúng tôi có thể sử dụng Foundation với HTML5Boilerplate không?
- 8. Hành vi của tuyên bố trả lại khi bắt và cuối cùng là
- 9. Chúng tôi có thể sử dụng "KHÔNG THÍCH" trong sql
- 10. Chúng tôi có thể sử dụng & trong url không?
- 11. Các lớp học cuối cùng trong Java không nên là cuối cùng hoặc ngược lại?
- 12. Tôi có thể sử dụng lại LayoutPrams với ViewGroup.addView không?
- 13. Android onNewIntent từ trình khởi chạy ứng dụng mang lại cho tôi ý định cuối cùng
- 14. Tôi có thể trả lại lịch Hồi giáo bằng cách sử dụng java.util.Calendar như thế nào?
- 15. Nhận câu trả lời cuối cùng
- 16. Quay trở lại thử và bắt so với trả lại cuối cùng?
- 17. "Thử" của Scala có nghĩa là gì nếu không bị bắt hoặc chặn cuối cùng?
- 18. Chúng tôi có thể sử dụng mô hình yêu cầu/trả lời trong thông báo xuất bản/đăng ký không?
- 19. Khi nào chúng ta nên sử dụng biến cuối cùng tĩnh chưa được khởi tạo?
- 20. Tôi có thể sử dụng PHP 5.3 Closures như thế nào Chúng tôi sử dụng các khối trong Ruby
- 21. Làm thế nào tôi có thể rollback lệnh xóa cuối cùng của tôi trong mysql?
- 22. tôi không thể có cả hai từ khóa trên cùng một dòng: riêng tư cuối cùng ...()?
- 23. Làm thế nào không thể sử dụng "cuối cùng" là một vấn đề an ninh?
- 24. PHP - khi sử dụng foreach để lặp qua mảng, làm cách nào tôi có thể biết liệu tôi có đang sử dụng cặp cuối cùng không?
- 25. Làm thế nào bạn có thể trả lại mọi thứ sau dấu gạch chéo cuối cùng (/) trong chuỗi Ruby
- 26. Trả về ID được chèn cuối cùng mà không cần sử dụng truy vấn thứ hai
- 27. vim: Tôi có thể có khóa cuối cùng của liên kết đa khóa lặp lại lệnh không?
- 28. là mod_rails hoặc Phusion Passenger cuối cùng là câu trả lời cho Ruby on Rails Deployment?
- 29. Tôi có thể sử dụng lại HttpWebRequest không?
- 30. thứ tự thực hiện cố gắng nắm bắt và cuối cùng là chặn
Bạn cũng có thể xem qua [** bài đăng này **] (http://stackoverflow.com/q/18131447/1679863) –