2011-12-08 43 views
11

Đối với ứng dụng Java của tôi, tôi đang tạo một cá thể của một đối tượng thông tin người dùng và điền nó với một dịch vụ mà tôi không kiểm soát nguồn.Java - bỏ qua ngoại lệ và tiếp tục

Mã này trông như thế này:

// username given as parameter 
UserInfo ui = new UserInfo(); 
try { 
    DirectoryUser du = LDAPService.findUser(username); 
    if (du!=null) { 
     ui.setUserInfo(du.getUserInfo()); 
    } 
} catch (Exception e) { 
    // Whatever 
} 

Nếu LDAPService.findUser() không thể xác định vị trí một người sử dụng, nó sẽ ném một NullPointerException và xay phần còn lại của ứng dụng của tôi dừng lại. Sẽ ổn nếu thông tin người dùng không được phổ biến, vì vậy tôi muốn có thể tiếp tục mà không gây ra mọi thứ khác để bắt đầu ném ngoại lệ.

Có cách nào để thực hiện việc này không?

+6

Bỏ qua ngoại lệ là hành vi không tốt! – mre

+5

Mã của bạn có làm điều này không? Miễn là '// Dù' không làm gì cả, việc thực thi sẽ tiếp tục bình thường sau khối try/catch. –

+0

vấn đề là gì? Nếu 'findUser' ném một ngoại lệ, nó bị bắt trong' catch' mà bạn đã viết. Nó sẽ không dừng lại bất kỳ thứ gì? – Nanne

Trả lời

18

Tôi đã upvoted Amir Afghani's answer, dường như chỉ có một câu trả lời thực sự.

Nhưng tôi sẽ có văn bản nó như thế này thay vì:

UserInfo ui = new UserInfo(); 

DirectoryUser du = null; 
try { 
    du = LDAPService.findUser(username); 
} catch (NullPointerException npe) { 
    // It's fine if findUser throws a NPE 
} 
if (du != null) { 
    ui.setUserInfo(du.getUserInfo()); 
} 

Tất nhiên, nó phụ thuộc vào hay không, bạn muốn bắt NPEs từ ui.setUserInfo()du.getUserInfo() cuộc gọi.

+1

Tôi sẽ đánh dấu bạn là câu trả lời. Có vẻ như tất cả những gì tôi cần là một khối thử/nắm chặt hơn. – SpeedBurner

+1

Tôi đã bỏ phiếu cho câu trả lời của bạn vì a) bạn nói đúng và b) bạn đã gọi cho tôi một cách rõ ràng. –

+0

Tôi sẽ thêm vì chúng tôi không nhất thiết muốn bắt và bỏ qua TẤT CẢ NullPointerExceptions, người ta có thể xem thêm chi tiết về NPE (getCause, getMessage, getLocalizedMessage, getStackTrace) và nếu nó không phù hợp với tiêu chí rất cụ thể và hẹp , ném lại. Nhưng sau đó, tôi chỉ nhận thấy bình luận của tôi là khoảng 7 năm sau khi thực tế. – mtwagner

0

Bạn có thể viết một khối try - catch quanh dòng bạn muốn bỏ qua.

Giống như trong mã ví dụ của bạn. Nếu bạn chỉ cần tiếp tục mã của bạn dưới khung đóng của các khối đánh bắt thì mọi thứ đều tốt.

3

Bạn đã làm điều đó trong mã của mình. Chạy ví dụ dưới đây. Việc nắm bắt sẽ "xử lý" ngoại lệ, và bạn có thể di chuyển về phía trước, giả sử bất cứ điều gì bạn bị bắt và xử lý không phá vỡ mã xuống con đường mà bạn không lường trước được.

try{ 
     throw new Exception(); 
}catch (Exception ex){ 
    ex.printStackTrace(); 
} 
System.out.println("Made it!"); 

Tuy nhiên, bạn phải luôn xử lý ngoại lệ đúng cách. Bạn có thể đưa mình vào một số tình huống khá lộn xộn và viết khó khăn để duy trì mã bằng cách "bỏ qua" ngoại lệ. Bạn chỉ nên làm điều này nếu bạn đang thực sự xử lý bất cứ điều gì đã đi sai với ngoại lệ đến mức nó thực sự không ảnh hưởng đến phần còn lại của chương trình.

0

Dịch vụ LDAPS phải chứa phương pháp như LDAPService.isExists(String userName) sử dụng phương pháp này để ngăn NPE bị ném. Nếu không - đây có thể là một giải pháp thay thế, nhưng sử dụng Đăng nhập để đăng một số cảnh báo ..

+0

Vấn đề chính là tôi không thể chỉnh sửa lớp LDAPService. – SpeedBurner

+0

Nếu có tôi có một cách để biết người dùng đó không có mặt trong LDAP là lấy NPE - bạn có thể bỏ qua nó, nhưng bằng cách bạn nên đăng nhập nó ở lớp INFO/DEBUG –

2

Thường được coi là một ý tưởng tồi để bỏ qua các ngoại lệ. Thông thường, nếu thích hợp, bạn muốn thông báo cho người dùng về sự cố (nếu họ quan tâm) hoặc ít nhất, hãy ghi lại ngoại lệ hoặc in dấu vết ngăn xếp vào bảng điều khiển.

Tuy nhiên, nếu điều đó thực sự không cần thiết (bạn là người đưa ra quyết định) thì không, không có cách nào khác để bỏ qua ngoại lệ buộc bạn bắt nó. Bản sửa đổi duy nhất, trong trường hợp đó, tôi khuyên bạn nên liệt kê rõ ràng loại ngoại lệ mà bạn bỏ qua và một số nhận xét là lý do tại sao bạn bỏ qua chúng, thay vì chỉ bỏ qua ngoại lệ bạn đã làm trong ví dụ của bạn.

18

Bạn có thể nắm bắt một cách rõ ràng và bỏ qua nó NullPointerException - mặc dù thường không được khuyến nghị. Tuy nhiên, bạn nên không phải, bỏ qua tất cả các ngoại lệ như bạn hiện đang làm.

UserInfo ui = new UserInfo(); 
try { 
    DirectoryUser du = LDAPService.findUser(username); 
    if (du!=null) { 
     ui.setUserInfo(du.getUserInfo()); 
    } 
} catch (NullPointerException npe) { 
    // Lulz @ your NPE 
    Logger.log("No user info for " +username+ ", will find some way to cope"); 
} 
1

Bạn đang thực sự bỏ qua ngoại lệ trong mã của mình. Nhưng tôi đề nghị bạn xem xét lại.

Dưới đây là một trích dẫn từ Coding Crimes: Ignoring Exceptions

Đối với một sự khởi đầu, các ngoại lệ nên được đăng nhập ít nhất, không chỉ viết ra để giao diện điều khiển.Ngoài ra, trong hầu hết các trường hợp, ngoại lệ phải được gửi lại cho người gọi để họ xử lý. Nếu nó không cần phải được trả lại cho người gọi, thì ngoại lệ sẽ được xử lý. Và một số bình luận cũng sẽ rất tuyệt.

Lý do thông thường cho loại mã này là "Tôi không có thời gian", nhưng có hiệu ứng gợn sóng khi mã ở trạng thái này. Rất có thể là rằng hầu hết loại mã này sẽ không bao giờ thoát ra trong sản xuất cuối cùng. Đánh giá mã hoặc công cụ phân tích tĩnh phải bắt mẫu lỗi này. Nhưng đó không phải là lý do, tất cả điều này làm là thêm thời gian để bảo trì và gỡ lỗi phần mềm.

Thậm chí nếu bạn bỏ qua, tôi khuyên bạn nên sử dụng tên ngoại lệ cụ thể thay vì tên siêu lớp. ví dụ: Sử dụng NullPointerException thay vì Exception trong mệnh đề catch của bạn.

0

In theo dõi STACK, ghi nhật ký hoặc gửi tin nhắn cho người dùng, là những cách rất xấu để xử lý các ngoại lệ. Có ai có thể mô tả các giải pháp để khắc phục ngoại lệ trong các bước thích hợp sau đó có thể thử các hướng dẫn bị hỏng một lần nữa?

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