2013-06-23 16 views
8

Sự khác biệt giữa "cuối cùng" và viết sau "bắt" là gì?Sự khác biệt giữa cuối cùng và viết sau khi bắt

Ví dụ:

public boolean example() { 
    try { 
     // Code 
    } catch (RuntimeException e) { 
     // Code 
    } finally { 
     return true; 
    } 
} 

public boolean example() { 
    try { 
     // Code 
    } catch (RuntimeException e) { 
     // Code 
    } 
    return true; 
} 
+0

Bạn có thể thêm logic để đóng tài nguyên trong câu lệnh chặn 'cuối cùng' và nhận ngoại lệ tại đây, do đó, phương án thay thế tốt nhất sẽ là sau (IMO). –

+0

không có sự khác biệt trong ví dụ của bạn. Làm một số dọn dẹp trong cuối cùng mà sẽ được thực hiện anyway. – Tala

Trả lời

2

Không khác biệt trong trường hợp của bạn. nhưng

Hệ thống thời gian chạy luôn thực hiện các câu lệnh trong phạm vi finally block bất kể điều gì xảy ra trong khối thử.

Vì vậy, đây là nơi hoàn hảo để thực hiện dọn dẹp.

Lưu ý rằng nếu bạn đang sử dụng JDK 7+, thì hầu hết việc sử dụng khối cuối cùng có thể được loại bỏ, chỉ cần sử dụng try-with-resources statement.

3

Trong mã bạn đã cung cấp, không có sự khác biệt. Nhưng cuối cùng được sử dụng để chạy một số đoạn mã sau khi khối thử không có vấn đề cho dù có một ngoại lệ hay không.

Điểm thú vị để thực hiện ở đây là, chúng ta nên tránh quay trở lại từ khối cuối cùng bởi vì nó có thể tạo ra sự nhầm lẫn trong scenarion khi chúng ta trả lại một cái gì đó từ khối thử là tốt. Hãy xem xét đoạn mã này:

try { 
    return true; 
} 
finally { 
    return false; 
} 

Bây giờ mã này sẽ trả về false bất kể điều gì xảy ra trong thử. Theo nhiều cách, hành vi này hoàn toàn phù hợp với sự hiểu biết thông tục về những gì cuối cùng có nghĩa là - "không có vấn đề gì xảy ra trước trong khối thử, luôn chạy mã này." Do đó nếu bạn trả về đúng từ một khối cuối cùng, hiệu ứng tổng thể phải luôn luôn trở lại đúng, không?

Nói chung, đây là hiếm khi một thành ngữ tốt, và bạn nên sử dụng cuối cùng khối tự do để làm sạch nguồn/đóng cửa nhưng hiếm khi nếu bao giờ hết trả về một giá trị từ họ.

+0

Nếu cuối cùng chấm dứt đột ngột, bằng cách trả lại hoặc bằng cách ném một ngoại lệ, bất kỳ trở lại trước đó của cuộc gọi chức năng được bỏ qua. Điều này có nghĩa là cuối cùng sẽ nuốt bất kỳ ngoại lệ hoặc giá trị trả lại thông thường, nếu nó ném một ngoại lệ hoặc bạn sử dụng trở lại. Như đã nêu chỉ sử dụng cuối cùng cho việc dọn dẹp tài nguyên, và lưu ý rằng nếu bạn thực hiện cuộc gọi cuối cùng có thể ném một ngoại lệ, bạn nên bọc chúng trong cố gắng nắm bắt để tránh nuốt các ngoại lệ khác. Nếu bạn sử dụng try-with-resources, bạn có thể nhận được ngoại lệ bị nuốt với Throwable.getSuppressed() –

-2

cuối cùng() được sử dụng bất cứ khi nào chúng ta muốn rằng một số dòng mã nên được thực hiện ngay cả khi ngoại lệ xảy ra Nhưng nếu u viết dòng mã sau khi bắt nó sẽ không thực hiện nếu ngoại lệ xảy ra ..

+2

Điều này chỉ đơn giản là sai. Mã thực thi sau khi thử. –

4

Đầu tiên hết, thành ngữ duy nhất mà thậm chí có thể được coi là một ứng cử viên là thế này:

try { 
    // stuff 
} catch (Throwable t) { /* handle */ } 
// finally stuff 

Note loại bắt. Chỉ khi bạn bắt bất kỳ ngoại lệ nào có thể, bao gồm những quái vật tối tăm như ThreadDeathVirtualMachineError, bạn có thể hy vọng vô điều kiện tiếp cận mã dưới sự cố gắng này.

Nhưng, đó chỉ là nơi bắt đầu. Điều gì sẽ xảy ra nếu mã xử lý tự ném một ngoại lệ? Vì vậy, bạn cần ít nhất

try { /* main stuff */ } 
catch (Throwable t) { 
    try { /* handle */ } catch (Throwable t) { 
    // no code allowed here! Otherwise we descend into infinite recursion 
    } 
} 
/* finally stuff */ 

Bây giờ bạn có thể bắt đầu nhận ra lợi ích của finally, nhưng đó không phải là tất cả. Hãy xem xét một trường hợp khá điển hình:

try { 
    /* main stuff, may throw an exception. I want the exception to 
    break what I'm doing here and propagate to the caller */ 
    return true; 
} finally { /* clean up, even if about to propagate the exception */ } 

Làm cách nào để bạn viết lại? Nếu không có mã trùng lặp, không thể.

0

Điều đầu tiên phải hiểu trong câu hỏi này là "tại sao chúng tôi sử dụng try {} catch {} block" Ok.

Câu trả lời là, khi có một khả năng mã của chúng tôi ném một ngoại lệ.

Các loại mã này chúng tôi đưa vào thử {...} khối & catch {...} khối chứa mã để bắt ngoại lệ được tạo bởi mã trong khối try {}.

Cuối cùng {...} khối chứa mã thực thi ngay lập tức sau khi try {} catch {} block khi try {} khối ném một ngoại lệ.

ví dụ: Khi bạn truy cập một số trang web, nhưng không thể hiển thị một số loại thư như "lỗi 404 hoặc máy chủ đang cập nhật", các loại mã này được viết cuối cùng.

0

bắt đơn giản đây chỉ là cho bắt ngoại lệ và xử lý nó, nhưng cuối cùng, thực hiện nếu ngoại lệ hay không, ví dụ như cho kết nối chặt chẽ.

1

Chúng tôi sử dụng khối thử, khối catch và cuối cùng chặn để xử lý Ngoại lệ trong chương trình của chúng tôi. Một chương trình có thể có ngoại lệ kiểm tra hoặc không được kiểm tra. do đó, khối này được sử dụng để xử lý những ngoại lệ đó. Trong khối try chúng ta đề cập hoặc viết những mã có thể là nguyên nhân của một ngoại lệ và nếu chúng ta muốn mã của chúng ta sẽ chạy nếu ngoại lệ xảy ra Sau đó chúng ta viết mã đó vào khối catch. cuối cùng là một khối rất đặc biệt cho chúng ta một tính năng đặc biệt, nếu khối catch của chúng ta không chạy thì trước khi chương trình kết thúc, cuối cùng mã khối thực thi chắc chắn. phần lớn điều này được sử dụng để lưu dữ liệu của chúng tôi trong khi chấm dứt chương trình không mong muốn. nếu chúng ta sử dụng khối try thì phải có một khối catch sau khối try nhưng cuối cùng là một tùy chọn không bắt buộc.

0

Cuối cùng, khối hữu ích để dọn dẹp mã của bạn như đóng các luồng đang mở.

ví dụ:

File f = new File("\file.txt"); 
    FileStream fs; 
    try{ 
     fs = new FileStream(f); 
    } catch (IOException ioe){ 
     ioe.printStackTrace(); 
    } finally { 
     if (fs != null) { 
     fs.close() // close the stream 
     } 
    } 
0

Là mã của bạn chỉ trở true/false, vì vậy nó sẽ không ảnh hưởng nhiều. Nhưng hãy suy nghĩ cho bất kỳ mã/logic khác, nơi một số mã bắt buộc/dọn dẹp được viết để thực thi.

Ngoài ra, sẽ rất khó để nắm bắt tất cả các ngoại lệ thông qua mã của chúng tôi hoặc nói cách khác, chúng ta nên nắm bắt các ngoại lệ cụ thể mà chúng tôi có thể xử lý. Tại thời điểm đó, finally sẽ là vị cứu tinh thực sự, vì nó sẽ luôn luôn thực hiện (trừ System.exit() hoặc trong một số trường hợp đệ quy).

Ngoài ra, để mang tính nhất quán trong mã của chúng tôi, bạn phải luôn sử dụng mã finally để thực hiện bất kỳ mã làm sạch nào.

Bạn có thể tham khảo các bài viết dưới đây quá để làm rõ hơn:

0

Đầu tiên Trường hợp:

Nếu ngoại lệ xảy ra trong Blo thử ck thì khối catch sẽ được thực hiện, và trong khi phục vụ cùng một khối catch nếu có một lần nữa ngoại lệ xảy ra thì cuối cùng khối sẽ thực thi.

Thứ hai trường hợp:

Nếu ngoại lệ xảy ra trong khối try thì khối catch sẽ được thực thi, và nếu có ngoại lệ hơn nữa trong khối catch tương tự sau đó "return true;" sẽ thực hiện.

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