2009-11-25 28 views
12

Hãy nói rằng tôi có thể là một tập hợp các báo cáo:Java: Thử-Catch-Tiếp tục?

try { 
    String a = getProperty("a"); 
    String b = getProperty("b"); 
    String c = getProperty("c"); 
} catch(Exception e) { 

} 

Bây giờ, cho phép nói bất động sản b không được tìm thấy và các chức năng ném một ngoại lệ. Trong trường hợp này, làm thế nào tôi sẽ tiếp tục hoặc có thể đặt b thành null mà không cần phải viết một khối try-catch cho mỗi thuộc tính? Tôi có nghĩa là, a, b, c tồn tại nhưng đôi khi họ có thể không được tìm thấy ở tất cả trong đó một ngoại lệ được ném.

Trả lời

19

Giả sử bạn không thể thay đổi hàm để trả về null khi thuộc tính không được tìm thấy, bạn bị kẹt mọi thứ trong khối try try - đặc biệt nếu bạn muốn cho mọi giá trị có thể được lấy ra để được lấy (trái với việc cho phép giá trị đầu tiên không hủy bỏ toàn bộ hoạt động.)

Nếu bạn có nhiều đặc tính này để lấy, có lẽ sẽ sạch hơn khi viết phương pháp trợ giúp để sử dụng:

String getPropertySafely(String key) { 
    try { 
     return getProperty(key); 
    } catch (Exception e) { 
     return null; 
    } 
} 
+0

Điều này trông rất thú vị! Cảm ơn – Legend

+1

Tôi sẽ đặt tên nó là "getPropertyQuietly" chỉ vì họ sử dụng quy ước đặt tên đó trong Jakarta Commons IO (phương pháp closeQuietly trong lớp IOUtils) –

+4

+1 Ravi - Một con thú cưng lớn của tôi là nuốt ngoại lệ. Nếu bạn sẽ làm như vậy, ít nhất là làm cho nó rõ ràng dựa trên tên của phương pháp. (Clean Code) – Elliot

7

Bạn phải đặt thử thách xung quanh từng câu lệnh. Không có tiếp tục (như có trong ON ERROR ... RESUME khối trong VB). Thay vì:

String a = null; 
try { 
    a = getProperty("a"); 
} catch(Exception e) { 
    ... 
} 
String b = null; 
try { 
    b = getProperty("b"); 
} catch(Exception e) { 
    ... 
} 
String c = null; 
try { 
    c = getProperty("c"); 
} catch(Exception e) { 
    ... 
} 

bạn có thể viết:

public String getPropertyNoException(String name) { 
    try { 
    return getProperty(name); 
    } catch (Exception e) { 
    return null; 
    } 
} 

Cá nhân tôi nghĩ rằng một getProperty() là một ứng cử viên nghèo cho ném ngoại lệ chỉ dành riêng cho tất cả các soạn thêm này cần

+1

Ah ... Tôi nghĩ mình có thể tránh xa bằng cách tiếp cận đơn giản hơn .. Cảm ơn .. – Legend

+1

Yeah ... getProperty đến từ một thư viện khác và tôi thực sự không muốn chạm vào phần đó. – Legend

5

Vì bạn đang sử dụng cùng một hoạt động mỗi lần bạn có thể đặt giá trị này trong vòng lặp:

String[] abc = new String[3]; 
String[] param = {"a", "b", "c"}; 
for (int i = 0; i < 3; i++) { 
    try { 
     abc[i] = getProperty(param[i]); 
    } catch(Exception e) { 

    } 
} 

nhưng điều này là khá giả tạo và sẽ chỉ hữu ích cho một số lượng lớn các thuộc tính. Tôi nghi ngờ bạn sẽ phải viết đơn giản 3 try-catch.

3

Bạn nên xem xét lại cách getProperty được xử lý nếu bạn dự định sử dụng nhiều người trong số họ vì có không phải là một cách đơn giản để làm điều đó.

Bạn có thể khai thác tuyên bố finally nhưng bạn vẫn cần try-catch cho mọi cuộc gọi.

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