2010-09-13 22 views
8

Chúng ta đều biết nó là cần thiết.Tò mò: Tại sao cú pháp "ném <SomeSpecific> Exception" được yêu cầu trong Java một mình?

Nhưng TẠI SAO chỉ cần trong Java, khi các ngôn ngữ tương tự khác có khả năng xử lý ngoại lệ không yêu cầu chúng tôi viết "ném ngoại lệ"? Có ai biết điều gì đang xảy ra khi ngôn ngữ Java được thiết kế và tại sao họ làm theo cách đó? Chỉ tò mò thôi.

P.S. Đây có thể không phải là một câu hỏi thực tế hoặc thực sự cần thiết - nó có thể không giúp đỡ tôi trong anyway với các dự án đang diễn ra của tôi. Nhưng một số tính năng ngôn ngữ nhất định khiến tôi tò mò: D

Chỉnh sửa Có vẻ như câu hỏi của tôi rất mơ hồ! Tôi nghĩ tôi đã đặt câu hỏi sai. Chúng ta cần sử dụng cú pháp "ném ngoại lệ" tại một số điểm trong khi lập trình khi xử lý mã Java. Nhưng một cái gì đó như thế là không bao giờ cần thiết trong C# hoặc C++ hoặc thậm chí VB.Net và PHP. Vậy tại sao Java lại khẳng định điều này?

+1

Tôi hiểu rằng bạn chỉ thêm 'ném ngoại lệ 'khi phương thức gọi được yêu cầu để xử lý các ngoại lệ đó. Có lẽ tôi là sai mặc dù, tôi rất tốt có thể được. – Falmarri

Trả lời

11

Như câu trả lời khác ở đây đã chỉ ra, mệnh đề throws chỉ bắt buộc đối với checked exceptions, là một tính năng hiện chỉ tồn tại trong Java.

Câu trả lời chính thức như ngoại lệ tại sao Java đã kiểm tra là well documented:

Tại sao các nhà thiết kế quyết định buộc một phương pháp để xác định tất cả uncaught kiểm tra trường hợp ngoại lệ có thể được ném trong phạm vi của nó ? Bất kỳ ngoại lệ nào là có thể được ném bằng phương thức là một phần của lập trình công khai của phương thức giao diện. Những người gọi phương thức phải biết về các ngoại lệ mà phương pháp có thể ném để họ có thể quyết định phải làm gì với họ. Các trường hợp ngoại lệ này là một phần của giao diện lập trình của phương thức như các tham số và giá trị trả lại của nó.

Tuy nhiên, quyết định này là highly controversial, ngay cả trong cộng đồng Java:

Gần đây, một số cũng như coi các chuyên gia, trong đó có Bruce Eckel và Rod Johnson, đã tuyên bố công khai rằng trong khi họ ban đầu đã đồng ý hoàn toàn với vị trí chính thống trên các trường hợp ngoại lệ được kiểm tra , họ đã kết luận rằng sử dụng độc quyền các trường hợp ngoại lệ đã chọn là không phải là ý tưởng tốt như xuất hiện tại đầu tiên, và các ngoại lệ đã kiểm tra đã trở thành một nguồn đáng kể của các sự cố đối với nhiều dự án lớn. Eckel có một cái nhìn cực đoan hơn, cho thấy rằng tất cả ngoại lệ nên không được chọn; Quan điểm của Johnson là nhiều hơn bảo thủ, nhưng vẫn gợi ý rằng tùy chọn chính thống cho các trường hợp ngoại lệ được kiểm tra là quá mức. (Đó là giá trị lưu ý rằng các kiến ​​trúc sư của C#, người gần như chắc chắn có khá nhiều kinh nghiệm sử dụng công nghệ Java, đã chọn để bỏ qua ngoại lệ kiểm tra từ thiết kế ngôn ngữ, làm cho tất cả ngoại lệ trường hợp ngoại lệ không được kiểm soát. Họ đã, tuy nhiên, lại chỗ cho một thực hiện ngoại lệ kiểm tra tại một thời điểm sau đó.)

Cá nhân, tôi thấy trường hợp ngoại lệ kiểm tra để có ích chỉ khi API của bạn tạo ra một thói quen bắt tất cả các trường hợp ngoại lệ và tái ném chúng như một cái gì đó phù hợp với lớp trừu tượng của bạn. Ví dụ: bộ nhớ cache đối tượng trong bộ nhớ xảy ra để sử dụng đĩa hoặc phần phụ trợ SQL cho dữ liệu bộ nhớ cache sẽ không bao giờ được ném IOException hoặc SQLException - thay vào đó, nó sẽ ném (và khai báo) một số ngoại lệ do người dùng xác định như CacheFailureException hoặc tương tự.

Ngoài ra, bạn có thể tìm thấy bài viết của Ned Batchelder Exceptions in the Rainforest chiếu sáng liên quan đến câu hỏi này.

+0

+1 Câu trả lời chính xác và nhiều thông tin nhất. –

2

Java không yêu cầu bạn viết throws Exception trên khai báo chức năng, do đó, nó không phải là "cần thiết" nói chung. Nó đòi hỏi bạn phải khai báo các ngoại lệ có thể được ném bởi hàm, mà có thể không có ngoại lệ nào cả, hoặc chỉ là các ngoại lệ thời gian chạy. Thật vậy, sử dụng throws Exception có lẽ là một dấu hiệu của mã hóa lười biếng, vì nó hoạt động như một nắm bắt tất cả không hợp lý.

chỉnh sửa — cũng vì bạn đã chỉnh sửa câu hỏi của mình, câu trả lời bạn đang tìm kiếm (như những người khác đã nói) là Java có khái niệm "ngoại lệ" đã kiểm tra. Nó chỉ đơn giản là một quyết định thiết kế, được cho là cải thiện chất lượng mã. Nó có thể không thực sự giúp đỡ nhiều về lâu dài; bạn không thể sửa chữa một coder xấu với một thủ thuật ngôn ngữ.

+2

Tôi không nghĩ rằng áp phích có nghĩa là mã chính xác 'ném ngoại lệ 'theo nghĩa đó. Tôi đoán anh ta muốn biết tại sao java muốn lập trình viên tuyên bố ngoại lệ được ném từ phương thức như vậy và Ngoại lệ là một trình giữ chỗ cho các Ngoại lệ khác như FileNotFoundException, v.v. –

+0

@Faisal Chính xác ... Tôi đang chỉnh sửa câu hỏi của tôi và khi nào lẫn lộn nảy sinh. Hình như nó thực sự khá mơ hồ! –

+0

Ồ, nếu anh ấy không có ý đó, có lẽ anh ấy không nên gõ vào chính xác như thế :-) – Pointy

3

Nó tuyên bố rằng phương pháp có thể tăng ngoại lệ và cho phép nhà phát triển và công cụ của họ đảm bảo rằng họ đã xem xét khả năng đó.

Tuy nhiên, câu hỏi là không chính xác. Tuyên bố chỉ được yêu cầu khi ngoại lệ là ngoại lệ "đã kiểm tra". Và sau đó, một loại ngoại lệ cụ thể hơn sẽ được khai báo. Ném java.lang.Exception là kiểu kém.

Trường hợp ngoại lệ thời gian chạy, có nghĩa là, ngoại lệ do thời gian chạy tăng lên khi gặp lỗi cụ thể, không được yêu cầu yêu cầu. Trường hợp ngoại lệ thời gian chạy nên được ném khi lỗi có thể được ngăn chặn bằng cách lập trình tốt hơn và không phụ thuộc vào điều kiện môi trường khi chạy.

2

Có hai loại ngoại lệ

  1. Exceptions Checked
  2. Exceptions đánh dấu

Các ném khoản nói mà kiểm tra ngoại lệ được ném bởi phương pháp để người gọi có thể xử lý những trong hoặc họ sẽ phải thêm mệnh đề ném để cuối cùng ai đó sẽ phải xử lý các ngoại lệ này.

1

Java là một ngôn ngữ rất có tổ chức ngăn chặn trong nhiều trường hợp người dùng thiếu kinh nghiệm thiếu một số thứ liên quan hoặc quan trọng, ít nhất là lỗi có thể được hiển thị sau đó. Buộc bạn phải đề cập đến các trường hợp ngoại lệ trên khai báo hàm/phương thức là một cách để tiếp tục với chính trị đó và đồng thời một cách để cho phép bạn xác định ngoại lệ cụ thể của riêng bạn và đưa chúng vào sử dụng.

1

Điểm tuyên bố ngoại lệ trong Java là buộc nhà lập trình xử lý các lỗi có thể phát sinh khi thực hiện chương trình. Tuy nhiên, kinh nghiệm cho thấy rằng trong nhiều trường hợp, các lập trình xử lý "các trường hợp ngoại lệ không thực sự xử lý các trường hợp ngoại lệ, nhưng thay vì bỏ qua chúng:

 
void writeToFile() { 
    try { 
     ... 
    } catch (IOException ex) { 
     // Nothing here 
    } 
} 

Vì vậy, trong ngôn ngữ khác gần đây hơn Java các nhà thiết kế ưa thích không để kiểm tra trường hợp ngoại lệ , do đó các chương trình không kiểm tra lỗi sẽ ít nhất gặp sự cố với dấu vết ngăn xếp có ý nghĩa, do đó bạn sẽ dễ dàng sửa lỗi thay vì chương trình "misteriously" của bạn bị lỗi.

Cá nhân tôi thích kiểm tra trường hợp ngoại lệ trong Java vì:

  • Tôi không hành hạ ngoại lệ.
  • Trường hợp ngoại lệ khiến tôi nhận thức được các vấn đề có thể xảy ra mà mã của tôi có thể có.
  • Mã được tài liệu tốt hơn theo cách đó.

nhưng tôi có thể hiểu ngoại lệ không được kiểm soát. Hầu hết thời gian tôi xử lý một ngoại lệ là để đăng nhập nó, bọc nó với một số lớp con của RuntimeException và rethrow, bởi vì chúng chỉ có thể được gây ra bởi lỗi/cấu hình sai/triển khai bị hỏng. Tôi chỉ muốn sử dụng ngoại lệ đã kiểm tra cho vi phạm quy tắc kinh doanh.

0

Như tôi đã hiểu được lý do như đưa ra bởi các nhà thiết kế Java, các tình huống lỗi thường đặt trong hai loại:

  • Những người đều là phòng không gây tử vong và mã gọi điện thoại với lý do chính đáng sẽ có thể để phục hồi từ. FileNotFoundException khi đọc tệp biểu mẫu và IOExceptions khi làm việc với ổ cắm.
  • Những người gây tử vong nếu họ không thể có lý do chính đáng được mong đợi bằng mã gọi điện. Điều này bao gồm ArrayIndexOutOfBoundsException và ArithmeticException (khi chia cho số không).
Các vấn đề liên quan