Tại sao các trường hợp ngoại lệ được kiểm tra so với không được kiểm tra được gọi là Hướng dẫn tranh cãi về Java trong hướng dẫn Java Java?


10

Tôi chưa quen với Java và đang đọc tài liệu về các trường hợp ngoại lệ. và đặc biệt là các trường hợp ngoại lệ không được kiểm tra - Trang tranh cãi .

Dòng dưới cùng nói:

Nếu một khách hàng có thể được mong đợi phục hồi một cách hợp lý từ một ngoại lệ, hãy biến nó thành một ngoại lệ được kiểm tra. Nếu một khách hàng không thể làm bất cứ điều gì để phục hồi từ ngoại lệ, hãy biến nó thành một ngoại lệ không được kiểm tra.

Tôi không hiểu bài báo. Tất cả những gì về cuộc tranh cãi về vấn đề này là gì? Bạn có thể giải thích nó bằng những từ đơn giản?




Xin vui lòng xem câu hỏi được cập nhật, tôi không cảm thấy đây là một bản sao :)
ABcDexter

3
"Tôi đã cố đọc nó," - chuyện gì đã xảy ra?
Vô dụng

2
Nó được gọi như vậy bởi vì có rất nhiều tranh cãi xung quanh chủ đề đó. Xem thêm câu hỏi StackOverflow này: Vụ kiện chống lại các ngoại lệ được kiểm tra có đề cập đến một vài trích dẫn của những người nổi tiếng / có ảnh hưởng
Hulk

Câu trả lời:


3

Tôi sẽ cho bạn một ví dụ đầu tiên (nhưng cuối cùng là câu trả lời tại sao tranh cãi).

Giả sử bạn đang chỉnh sửa tài liệu trong trình chỉnh sửa tài liệu dựa trên Java và sau khi hoàn tất, bạn chọn Tệp-> Lưu dưới dạng ... và bạn đã chọn lưu tài liệu vào ổ đĩa mà bạn không có quyền ghi. Trình chỉnh sửa sẽ không gây ra lỗi cho bạn với một ngăn xếp xấu xí, nó sẽ đơn giản cho bạn biết rằng nó không thể lưu tệp và nó sẽ cho phép bạn tiếp tục chỉnh sửa và / hoặc lưu vào một vị trí khác.

Trong trường hợp như vậy, có lẽ một ngoại lệ đã được kiểm tra đã được mong đợi, bị bắt và hành động để phục hồi một cách ân cần từ nó.

Mặt khác, cung cấp cho các phép chia này bằng 0 hoặc ngoại lệ con trỏ null do lỗi lập trình gây ra cho cái đầu xấu xí của nó chỉ trong một số điều kiện nhất định. Điều đó có thể xảy ra ở bất cứ đâu trong mã, RAM có thể bị hỏng, v.v. Không tài liệu API nào sẽ cho bạn biết "phương pháp này sẽ ném một số chia cho 0 nếu RAM bị hỏng" .

Các ngoại lệ được kiểm tra phải là một phần của thiết kế và người dùng API đó nên chuẩn bị để xử lý chúng. Các ngoại lệ không được kiểm soát có thể xảy ra ở hầu hết mọi nơi và nằm ngoài tầm kiểm soát của chúng tôi.

Tranh cãi nảy sinh từ các lập trình viên sử dụng các ngoại lệ không được kiểm tra (mở rộng từ RuntimeException) khi họ nên sử dụng các ngoại lệ được kiểm tra:

  • như một shorcut không bị làm phiền bởi trình biên dịch
  • để làm cho chữ ký của họ trông đơn giản hơn
  • bởi vì họ cho rằng các ngoại lệ được kiểm tra là một vấn đề phụ thuộc (nếu bạn ném một ngoại lệ được kiểm tra mới trong một lớp triển khai, bạn nên sửa đổi chữ ký của giao diện) và ngược lại.

"bạn nên sửa đổi chữ ký của giao diện" - tốt, thậm chí bạn còn bị trình biên dịch buộc phải làm như vậy và bạn sẽ phải xử lý hoặc khai báo nó sẽ bị ném tại mỗi trang web cuộc gọi.
Hulk

3
Việc ứng dụng UI xử lý đúng lỗi theo cách thân thiện với người dùng hay không dựa trên mức độ lập trình viên viết mã. Họ có thể viết mã tốt theo cách đó với các ngoại lệ không được kiểm tra, giống như người khác có thể xử lý sai các lỗi với các ngoại lệ được kiểm tra. Các ý định ngoại lệ kiểm tra là để làm cho nó dễ dàng hơn cho các lập trình để xử lý đúng đắn các lỗi. Tranh cãi không phải là những gì bạn đã tuyên bố ở đây, mà là liệu họ có thực sự thực hiện thành công mục tiêu đó hay không thực sự giúp xử lý lỗi dễ dàng hơn. Theo quan điểm của nhiều người, họ không; họ làm cho nó khó hơn
Phục vụ

@Servy Theo cách thân thiện với người dùng, ứng dụng UI có thể xử lý thực tế chip RAM bị lỗi hay không có chu kỳ CPU do một phần mềm khác bị trục trặc?
Tulains Córdova

1
@ TulainsCórdova Trong cả hai trường hợp những chương trình thậm chí sẽ không chạy , vì vậy không có xử lý được thực hiện ngoại lệ thời gian , vậy làm thế nào bạn cố gắng để đại diện cho một lỗi là không thích hợp khi bạn không thể bao giờ thậm chí chạy bất kỳ của bạn mã khi nó xảy ra.
Phục vụ

1
@ TulainsCórdova Bạn không nhất thiết phải gặp lỗi để xử lý nó, nhưng vâng, trình biên dịch sẽ không cho bạn biết rằng nó có thể bị ném. Tranh cãi là liệu trình biên dịch có nói với bạn rằng ngoại lệ có thể bị ném hay không thực sự hữu ích. Một số nghĩ rằng nó là, một số nghĩ rằng nó không. Câu hỏi ở đây là tranh cãi , và đó là câu trả lời. Tuyên bố của bạn về những gì tranh cãi cốt lõi của các ngoại lệ được kiểm tra không phải là nó.
Phục vụ

-4

Không có tranh cãi trên trang đó. Đó là Oracle bảo mọi người sử dụng các ngoại lệ được kiểm tra.

Sự 'tranh cãi' giả mà họ đã phát minh ra ở đây là giữa các nhà thiết kế ngôn ngữ và người sử dụng ngôn ngữ. Các nhà thiết kế cho phép mọi người ném và bắt những thứ mà (trong tâm trí của họ) không nên ném hoặc bắt. Vì vậy, họ đã tạo ra một trang web phàn nàn về các nhà phát triển lười biếng.


4
một cuộc tranh cãi ngay cả khi trang đó nói rất ít về nó. Điều gây tranh cãi là câu trả lời cho câu hỏi, "Các ngoại lệ được kiểm tra có giúp ích hay cản trở sự phát triển của phần mềm tốt hơn không?" Và, "Nếu vậy, những trường hợp ngoại lệ nào cần được kiểm tra và những trường hợp nào không được kiểm tra?" Tôi cá rằng bạn có thể bắt đầu một cuộc thảo luận sôi nổi nếu bạn có đủ nhà phát triển (và bia) cùng nhau trong một phòng để trả lời những câu hỏi đó.
Solomon chậm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.