2013-07-31 29 views
8

Đây là những gì tôi đang cố gắng làm:Java - Nếu tôi trở lại trong khối catch, khối cuối cùng sẽ được thực hiện?

try { 

    //code 
} catch (Exception e) { 

    return false; 
} finally { 

    //close resources 
} 

Điều này có hiệu quả không? Có thực hành xấu không? nó sẽ tốt hơn làm điều này:

boolean inserted = true; 

try { 

    //code 
} catch (Exception e) { 

    inserted = false; 
} finally { 

    //close resources 
} 

return inserted; 
+6

tự thử? – Ankit

+0

cảnh báo kép! bạn đã thử tìm kiếm chưa? điều này đã được hỏi nhiều lần qua ... – devnull

+0

@devnull Tôi đã nghiên cứu nhưng tôi không chắc đó có phải là một việc hay hay không. Một số chủ đề nói rằng nó là OK, trong khi những người khác nói rằng nó không phải là rất tốt. –

Trả lời

20

Có, nó sẽ. Những điều duy nhất có thể ngăn chặn một khối cuối cùng để thực hiện (AFAIR) là System.exit(), và một vòng lặp vô hạn (và một vụ tai nạn JVM, tất nhiên).

+7

... và cúp điện :) (vụ nổ, bạn đã hủy hoại nó bằng cách thêm sự cố JVM) – ppeterka

+0

Nhưng ví dụ đầu tiên của tôi là một thực tiễn không tốt? –

+2

Các bit thú vị, bị bỏ qua bởi nhiều, là 'Thread # stop' sẽ * không * ngăn chặn' cuối cùng' thực hiện. –

5

Khối finally được thực hiện mọi khi, vô điều kiện, như điều cuối cùng khối try-catch-finally làm. Ngay cả khi bạn thực thi Thread#stop đối với nó, khối finally sẽ vẫn hoạt động, giống như một ngoại lệ thông thường được làm mờ.

Không chỉ vậy, nếu bạn quay trở lại từ finally, giá trị trả lại đó sẽ lấy mẫu trên số tiền trả về từ try hoặc catch.

BTW Ví dụ đầu tiên của bạn không chỉ tốt mà còn được ưu tiên. Trong ví dụ thứ hai, người đọc phải theo đuổi các bài tập cho biến, đó là một công việc tẻ nhạt và cho phép các lỗi trượt qua rất dễ dàng.

+1

im không đồng ý với '..btw' một phần, tôi nghĩ tốt hơn là chỉ có một câu trả về nhưng điều đó mang lại cho tôi để tìm hiểu về điều đó ở đây (khái niệm về sự trở lại chỉ đến từ đâu) [http: // lập trình viên. stackexchange.com/questions/118703/where-did-the-notion-of-one-return-only-come-from] – nachokk

+1

Đó là một cách viết đẹp! (câu trả lời đầu tiên) –

4

Cả hai đều giống nhau. Tuy nhiên, hãy cẩn thận với trường hợp sau:

int i = 0; 

try 
{ 
    //code 
} 
catch(Exception e) 
{ 
    return i; 
} 
finally 
{ 
    i = 1; 
} 

0 là những gì sẽ được trả lại.

+0

Sau đó, tôi nghĩ rằng ví dụ của tôi không phải là một thực hành tốt, phải không? –

+0

@Thecoolguyacrossthestreet Cách tốt nhất là sử dụng mã sạch bất cứ khi nào có thể. –

0

Tôi chỉ muốn nói thêm rằng nó được mô tả trong the specs:

Nếu khối catch hoàn đột ngột vì lý do R, sau đó khối cuối cùng được thực hiện.

nơi tất nhiên

Có thể thấy, sau đó, rằng một tuyên bố trở lại luôn hoàn thành đột ngột.

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