2010-05-07 38 views
12

Đặc điểm ngoại lệ có phải là một phần của chữ ký phương pháp không? Những gì tôi có nghĩa là:Đặc điểm ngoại lệ

public void someMethod(String myString) throws IOException 

là 'throws IOException' một phần của một chữ ký của phương pháp này?

Cảm ơn

Trả lời

6

Theo dõi trên Jon Skeet's answer và để đáp ứng với những nhận xét

@ Jon Skeet Vậy tại sao tôi không thể có public void run() throws IOException trong một lớp học mà thực hiện Runnable? - Biết tôi biết bạn

Mục 8.4.6 của ngôn ngữ Java Specification (3rd ed) nói:

Một phương pháp đó sẽ ghi đè hoặc ẩn một phương pháp khác (mục 8.4.8), bao gồm các phương pháp mà thực hiện abstract phương pháp quy định tại các giao diện, có thể không được công bố để ném hơn ngoại lệ đã kiểm tra so với phương pháp được ghi đè hoặc ẩn.

Chính xác hơn, giả sử rằng B là một lớp hoặc giao diện, và Một là một lớp cha hoặc superinterface của B, và một phương pháp kê khai n trong B ghi đè hoặc ẩn một phương pháp kê khai m trong A. Nếu n có một điều khoản throws đề cập đến bất kỳ loại ngoại lệ kiểm tra, sau đó m phải có một điều khoản throws, và cho tất cả các kiểm tra loại trừ được liệt kê trong throws khoản của n, mà lớp ngoại lệ tương tự hoặc một trong các siêu kiểu của nó phải xảy ra trong việc xóa bỏ mệnh đề throws của m; nếu không, một lỗi biên dịch sẽ xảy ra.

Nó không phải là vấn đề chữ ký phương pháp ở đây, nhưng vấn đề không yêu cầu người gọi tính đến ngoại lệ mà không bắt buộc phải được kiểm tra bằng phương pháp 'nguyên bản' mà họ đang gọi.

5

số Từ section 8.4.2 of the Java Language Spec:

Hai phương pháp có chữ ký cùng nếu họ có cùng tên và lập luận loại.

Hai phương pháp hoặc constructor tờ khai M và N có các loại lập luận tương tự nếu tất cả các điều kiện sau đây giữ:

Họ có cùng một số chính thức thông số (có thể không) Họ có cùng số tham số kiểu (có thể là 0) Hãy để các tham số kiểu chính thức của M là và để là loại thông số chính thức N. Sau khi đổi tên mỗi lần xuất hiện của kiểu Bi trong N thành Ai giới hạn của correspon ding loại biến và các loại đối số của M và N là giống nhau.

Vì vậy, hai phương pháp có cùng tên và đối số nhưng có các ngoại lệ được khai báo khác nhau, chúng có cùng chữ ký.

Bên cạnh đó, từ the document Bozho quotes:

Định nghĩa: Hai trong số các thành phần của một bản tuyên bố phương pháp bao gồm các phương pháp chữ ký tên -the của phương pháp và loại tham số.

Không đề cập đến trường hợp ngoại lệ có ...

EDIT: Đối trọng một phương pháp (hoặc thực hiện một giao diện), từ section 8.4.8.3:

Một phương pháp kê khai phải không có một ném mệnh đề xung đột (§8.4.6) với bất kỳ phương pháp nào mà nó ghi đè hoặc ẩn; nếu không, xảy ra lỗi biên dịch .

+0

@ Jon Skeet Tại sao sau đó tôi không thể có công khai void run() ném IOException trong một lớp học mà thực hiện Runnable? –

+0

Jon là đúng :) Nhưng có lẽ một cái gì đó cho tác giả để lưu ý. Bạn có thể khai báo rằng các phương thức của bạn đưa ra một ngoại lệ thấp hơn trong thừa kế ngoại lệ so với ngoại lệ được khai báo trong phương thức giao diện/siêu lớp và nó vẫn sẽ là một thực thi/ghi đè hợp lệ của phương thức. – Justin

+0

@Khi tôi biết bạn: Bởi vì việc triển khai giao diện hoặc ghi đè phương thức phải làm nhiều hơn là chỉ khớp với chữ ký. Nó cũng phải tránh tuyên bố rằng nó sẽ ném bất kỳ ngoại lệ kiểm tra nhiều hơn những người được tuyên bố. –

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