2009-02-09 19 views
7

Tôi đã nhận thấy với Integer.parseInt() rằng bạn không phải bao quanh nó bằng cách thử bắt hoặc tuyên bố rằng phương pháp có thể ném ngoại lệ, mặc dù thực tế là nó "ném" một NumberFormatException.Tại sao bạn không phải tuyên bố rõ ràng rằng bạn có thể ném một số ngoại lệ được xây dựng trong Java?

Tại sao tôi không phải nắm bắt rõ ràng NumberFormatException hoặc tuyên bố rằng phương pháp của tôi sẽ ném nó?

Trả lời

16

Vì đó là ngoại lệ "thời gian chạy".

RuntimeExceptions được sử dụng để xác định các vấn đề lập trình (mà một lập trình viên tốt có thể tránh được) trong khi

ngoại lệ Checked là để xác định các vấn đề môi trường (mà không thể tránh được cho dù như thế nào tốt bạn có chương trình, một server bị down ví dụ)

Bạn có thể đọc thêm về them here

thực tế, có three kinds of exceptions, chỉ một trong số họ nên h andled (hầu hết các lần)

+0

Đó là mô tả không đúng về sự khác biệt giữa thời gian chạy/ngoại lệ được kiểm tra. Đó là ** không phải ở tất cả ** sự khác biệt giữa chúng. Có 'RuntimeException' mà bạn * nên * bắt, và có những ngoại lệ được kiểm tra mà bạn có thể tránh bằng cách thực hiện kiểm tra bổ sung trước khi gọi phương thức. – Aaron

+0

Ex1: 'NumberFormatException' là một thứ mà bạn thường nên nắm bắt. Việc nắm bắt 'NumberFormatException' tốt hơn là cố gắng tự kiểm tra định dạng của một chuỗi' String' trước khi chuyển đổi nó thành một số, khi đó bạn có thể * vẫn * kết thúc bằng 'NumberFormatException' mà bây giờ bạn không bắt được. – Aaron

+0

Ex2: 'IOException' là một trong số đó được đưa ra khắp nơi bởi nhiều API. Đây có lẽ là ngoại lệ bị bắt nhiều nhất đối với tôi và ngoại lệ bị bắt nhiều nhất mà tôi thấy trong mã của người khác. Có rất nhiều nơi mà bạn buộc phải bắt 'IOException' hoặc các lớp con của nó, nơi nó sẽ không bao giờ bị ném vào một số ngữ cảnh sử dụng API để ném nó. – Aaron

6

NumberFormatException mở rộng RuntimeException, bạn không phải xử lý rõ ràng bất kỳ thứ gì kế thừa từ RuntimeException.

RuntimeExceptions khác là những thứ như NullPointerException và IndexOutOfBoundsException. Đây là những điều mà các lập trình viên có thể tránh và phải cố gắng nắm bắt các loại ngoại lệ này sẽ tạo ra một số mã khá lộn xộn.

7
  Throwable 
     / \ 
     Error Exception 
       / \ 
      *checked* RuntimeException 
          \ 
         *unchecked* 

Xem Thinking in Java để có giải thích tốt về Ngoại lệ được kiểm tra và Bỏ chọn.

Một số xem xét ý tưởng về ngoại lệ đã kiểm tra là một thử nghiệm không thành công. Ví dụ, cả Spring và Hibernate sử dụng các ngoại lệ không được kiểm tra, và thường quấn các ngoại lệ đã kiểm tra trong các phiên bản không được kiểm tra.

2

Chỉ cần một nhận xét dài về câu trả lời của bộ công cụ.

Lý do ngoại lệ Kiểm tra là một vấn đề là họ cuối cùng dẫn đến mã như thế này:

try { 
    Something that throws an exception 
} catch (Exception e) {} 

Đây là trường hợp xấu nhất. Trước hết, họ không đăng nhập mà họ đang bắt ngoại lệ. Điều này xảy ra rất nhiều, và gần như bị lừa bởi các ngoại lệ được kiểm tra rất ngu ngốc như trên Thread.sleep(), nó ném InterruptedException rằng PHẢI bị bắt, nhưng 99% thời gian bạn không thể quan tâm ít hơn nếu bạn có một hay không .

Trong trường hợp trên, điều này được kết hợp bởi thực tế là mọi người có xu hướng chỉ bắt "Ngoại lệ" nếu có nhiều hơn một lần ném. Điều đó có nghĩa rằng ngay cả khi một ngoại lệ không được kiểm soát quan trọng được ném ra, nó sẽ bị bắt và bỏ qua khiến nó hầu như không thể tìm ra vấn đề.

Nhiều hơn một lần tôi đã tham gia vào các đội phải chi tiêu khoảng một tháng để cố gắng theo dõi các lỗi bị ẩn theo cách này.

Đó là một khái niệm tốt sẽ trở nên khủng khiếp khi bạn thêm vào thực tế là con người là những người phải thực hiện nó một cách có trách nhiệm.

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