2012-06-20 49 views
6

Có ý nghĩa khi tuyên bố một phương thức để ném ngoại lệ và một lớp con của ngoại lệ này, ví dụ: IOExceptionFileNotFoundException?Phương pháp khai báo để ném ngoại lệ và phân lớp của ngoại lệ này

Tôi đoán rằng nó được sử dụng để xử lý cả hai ngoại lệ theo phương pháp người gọi khác nhau. Tuy nhiên, có thể xử lý cả hai ngoại lệ nếu phương pháp ném chỉ chung nhất là IOException?

Trả lời

7

Tuy nhiên, có thể xử lý cả hai ngoại lệ nếu phương thức này chỉ ném IOException tức là chung nhất?

Tuyệt đối. Bạn vẫn có thể bắt chúng riêng rẽ:

try { 
    methodThrowingIOException(); 
} catch (FileNotFoundException e) { 
    doSomething(); 
} catch (IOException e) { 
    doSomethingElse(); 
} 

Vì vậy, nó làm cho không có sự khác biệt với những gì người gọi thể làm gì nếu phương pháp tuyên bố cả hai - đó là không cần thiết. Tuy nhiên, nó có thể nhấn mạnh ngoại lệ mà bạn có thể muốn xem xét. Điều này có thể được thực hiện tốt hơn trong Javadoc hơn là tuyên bố ném.

0

Tuy nhiên, có thể xử lý cả hai ngoại lệ nếu phương pháp này chỉ ném chung nhất i.e> IOException?

catch(IOException ex){ 
if(ex instanceof FileNotFoundException){} 
} 

Nhưng điều này không giống sạch, Ném cả ngoại lệ có vẻ tốt, thậm chí người gọi sẽ đến để biết rằng phương pháp này có thể ném những những trường hợp ngoại lệ, vì vậy họ sẽ xử lý nó đúng

+0

Bạn nói đúng đó là không sạch sẽ - nhưng nó không cần thiết, một trong hai. Xem câu trả lời của tôi và của Karthik. Về cơ bản không cần phải có sự xấu xa này. –

+0

@Jon nếu chúng ta khai báo phương thức để ném IOException, làm thế nào người gọi đến để biết rằng nó cũng có thể tăng FileNotFoundException? –

+0

Nó không phải là "cũng" - một FileNotFoundException * là * một IOException, vì vậy bạn luôn có thể cố gắng nắm bắt nó nếu phương pháp tuyên bố rằng nó ném IOException. Nó sẽ được vào tài liệu để xác định trong những trường hợp xảy ra. –

0

Có, có thể xử lý cả hai nếu phương thức chỉ ném IOException.

Cách tốt nhất để trả lời câu hỏi như vậy là viết một bài kiểm tra để minh họa và thử nó. Hãy để JVM cho bạn biết câu trả lời. Nó sẽ nhanh hơn so với yêu cầu ở đây.

+0

Thực ra các câu trả lời khá nhanh và nhanh hơn tôi phải viết một lớp kiểm tra. Câu hỏi của tôi cũng là một phần khác và tôi hy vọng nó cũng hữu ích cho người khác. –

0

có. khi một số ngoại lệ chuyên biệt nhất định có thể được xử lý chính xác. Đó là, nếu bạn xử lý các trường hợp ngoại lệ như sau:

try { 
} catch (FileNotFoundException f) { 
//Try a different file 
} catch (IOException ioe) { 
//Fatal, Maybe bad blocks ... Bail out... 
} catch (Exception e) { 
//Something went wrong, see what it is... 
} 
3

Có ý nghĩa để khai báo một phương pháp để ném một ngoại lệ và một lớp con của ngoại lệ này, ví dụ IOException và FileNotFoundException?

Thông thường không - hầu hết các IDE tôi biết thậm chí là cảnh báo về các tuyên bố như vậy. Những gì bạn có thể và cần làm là ghi lại các ngoại lệ khác nhau được ném vào Javadoc.

Tuy nhiên, có thể xử lý cả hai trường hợp ngoại lệ nếu phương pháp này chỉ ném chung nhất i.e IOException?

Có, bạn chỉ cần đảm bảo rằng các khối catch theo đúng thứ tự, tức là cụ thể hơn trước.catch khối được đánh giá theo thứ tự chúng được xác định, vì vậy đây

try { 
    ... 
} catch (FileNotFoundException e) { 
    ... 
} catch (IOException e) { 
    ... 
} 

nếu ném ngoại lệ là một FileNotFoundException, nó sẽ được đánh bắt bởi các catch khối đầu tiên, nếu không nó sẽ rơi xuống thứ hai và bị xử lý như một chung IOException. Thứ tự ngược lại sẽ không hoạt động như catch (IOException e) sẽ bắt tất cả IOException s bao gồm FileNotFoundException. (. Trong thực tế, sau này sẽ cho kết quả trong một IIRC lỗi biên dịch)

0

Tuyên bố, rằng phương pháp này có thể ném (hơn generic) IOException, và (thêm cụ) FileNotFoundException thường là một điều tốt - đó là một thông tin bổ sung cho những người sử dụng mã của bạn sau này. Lưu ý rằng bạn nên nêu rõ trong JavaDoc, trong hoàn cảnh nào là mỗi trường hợp ngoại lệ được ném ra.

Họ vẫn sẽ có thể phân biệt các trường hợp ngoại lệ, và xử lý chúng khác nhau sử dụng các cấu trúc bắt như thế này:

try { 
    yourAwesomeMethod() 
} catch (FileNotFoundException ex) { 
    // handle file-not-found error 
} catch (IOException ex) { 
    // handle other IO errors 
} 
Các vấn đề liên quan