2012-05-03 27 views
9

Loại ngoại lệ nào tôi nên ném nếu loại đối tượng sai được chuyển vào phương thức compareTo của tôi?Loại ngoại lệ nào tôi nên ném nếu loại đối tượng sai được chuyển?

ClassCastException?

+0

Bạn có thể hiển thị mã 'compareTo' của mình không? – adarshr

+2

Vâng, điều đó phụ thuộc vào cách bạn xử lý ngoại lệ đó. Tôi có lẽ sẽ ném một 'IllegalArgumentException' với một thông điệp thích hợp. Btw, có thể có một cách để không cho phép vượt qua sai loại đối tượng? Bạn có thể giải thích về trường hợp sử dụng không? Có lẽ chúng tôi có thể giúp bạn ngăn chặn việc kiểm tra thời gian chạy đó và sử dụng sức mạnh của trình biên dịch. Lưu ý rằng 'Comparable' có thể được paremeterized với một parametera kiểu generic, do đó' compareTo' có thể sử dụng các tham số cụ thể. – Thomas

+1

Nếu bạn đang downcasting trong việc thực hiện compareTo, bạn sẽ nhận được rằng CCE miễn phí. Tại sao lại ném nó một cách rõ ràng. –

Trả lời

18

Nó sẽ là IllegalArgumentException theo nghĩa chung khi giá trị được truyền không phải là giá trị phù hợp.

Tuy nhiên, như @Tom's answer below đề xuất, nó cũng có thể là ClassCastException cho các loại không chính xác. Tuy nhiên, tôi chưa gặp phải mã người dùng thực hiện điều này.

Nhưng về cơ bản hơn, nếu bạn đang sử dụng số compareTo với generics, đây sẽ là lỗi thời gian biên dịch.

Hãy xem xét điều này:

public class Person implements Comparable<Person> { 
    private String name; 
    private int age; 

    @Override 
    public int compareTo(Person o) { 
     return this.name.compareTo(o.name); 
    } 
} 

Nơi nào bạn nhìn thấy khả năng của một loại sai được thông qua trong ví dụ trên?

+3

+1: Tốt hơn để có thời gian biên dịch hơn lỗi thời gian chạy. –

+0

Tại sao lại là downvote? – adarshr

+0

Bạn dường như không đồng ý với các tài liệu API quan tâm đến 'ClassCastException'. –

6

Không có gì ngạc nhiên khi số API docs chỉ định ngoại lệ được ném trong trường hợp này.

ClassCastException - nếu loại đối tượng được chỉ định ngăn không cho nó từ được so sánh với đối tượng này.

Giả sử bạn đang sử dụng Generics, bạn sẽ tự động nhận ngoại lệ này nếu ai đó cố gắng gọi phương thức của bạn bằng các loại thô, phản xạ hoặc một số kỹ thuật không an toàn khác.

+0

Tôi không đồng ý với điều này vì 'ClassCastException' sẽ được JVM đưa ra, trong đó OP hỏi về một ngoại lệ _they_ cần phải ném. Do đó tôi ủng hộ câu trả lời 'IllegalArgumentException'. Có lẽ đó là một điều ngôn ngữ, tuy nhiên. – maksimov

+1

@maksimov Tài liệu API rất rõ ràng. Bạn không đồng ý với đặc điểm kỹ thuật của phương pháp, đó là một vị trí bất thường để thực hiện. –

+0

Tom, tôi vừa mới nhận ra mình phải bị mù. Bằng cách nào đó tôi quản lý để lọc ra 'compareTo' họ đang thực hiện.Tôi muốn thay đổi tuyên bố của mình ở trên ngay bây giờ :-) – maksimov

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