Chào mừng độc giả của Cafedev! Hôm nay, chúng ta sẽ khám phá thế giới của Kotlin thông qua chủ đề “Kotlin với Ngoại lệ”. Tại Cafedev, chúng tôi không chỉ muốn chia sẻ kiến thức sâu rộng về lập trình mà còn tạo ra cơ hội để cộng đồng nâng cao kỹ năng và hiểu biết của mình. Hãy cùng nhau đào sâu vào Kotlin và khám phá cách xử lý ngoại lệ một cách thông minh và hiệu quả. Đừng ngần ngại tham gia thảo luận và chia sẻ ý kiến của bạn tại Cafedev – nơi mà kiến thức gặp gỡ sự sáng tạo!
Nội dung chính
1.Các lớp Ngoại lệ
Tất cả các lớp ngoại lệ trong Kotlin đều kế thừa từ lớp Throwable
. Mỗi ngoại lệ có một thông điệp, một ngăn xếp gọi và một nguyên nhân tùy chọn.
Để ném một đối tượng ngoại lệ, sử dụng biểu thức throw
:
Appendable append(CharSequence csq) throws IOException;
Để bắt một ngoại lệ, sử dụng biểu thức try
…catch
:
try {
// some code
} catch (e: SomeException) {
// handler
} finally {
// optional finally block
}
Có thể có không hoặc nhiều khối catch
, và khối finally
có thể được bỏ qua. Tuy nhiên, ít nhất một khối catch
hoặc finally
là bắt buộc.
try
là một biểu thức
try
là một biểu thức, có nghĩa là nó có thể có giá trị trả về:
val a: Int? = try { input.toInt() } catch (e: NumberFormatException) { null }
Giá trị trả về của biểu thức try
là hoặc là biểu thức cuối cùng trong khối try
hoặc biểu thức cuối cùng trong khối catch
(hoặc các khối). Nội dung của khối finally
không ảnh hưởng đến kết quả của biểu thức.
2. Kiểm tra Ngoại lệ
Kotlin không có kiểm tra ngoại lệ. Có nhiều lý do cho điều này, nhưng chúng tôi sẽ cung cấp một ví dụ đơn giản minh họa tại sao lại như vậy.
Dưới đây là một ví dụ về giao diện từ JDK được thực hiện bởi lớp StringBuilder
:
Appendable append(CharSequence csq) throws IOException;
Đoạn này nói rằng mỗi khi tôi thêm một chuỗi vào một thứ gì đó (một StringBuilder
, một loại nhật ký nào đó, một bảng điều khiển(console), v.v.),
Tôi phải bắt các IOExceptions
. Tại sao? Bởi vì triển khai có thể đang thực hiện các thao tác IO (Writer
cũng như triển khai Appendable
).Kết quả là mã như sau sẽ xuất hiện khắp nơi:
try {
log.append(message)
} catch (IOException e) {
// Must be safe
}
Và điều đó không tốt. Chỉ cần xem Effective Java, 3rd Edition, Mục 77: Đừng bỏ qua các ngoại lệ.
Bruce Eckel nói về ngoại lệ kiểm tra:
Việc xem xét các chương trình nhỏ dẫn đến kết luận rằng việc yêu cầu dùng các ngoại lệ có thể cải thiện cả năng suất của nhà phát triển và chất lượng mã, nhưng kinh nghiệm với các dự án phần mềm lớn lại cho thấy một kết quả khác – giảm năng suất và ít hoặc không tăng chất lượng mã.
Dưới đây là một số suy nghĩ bổ sung về vấn đề này:
* Checked exceptions của Java là một sai lầm (Rod Waldhoff)
* Vấn đề của Checked Exceptions (Anders Hejlsberg)
Nếu bạn muốn thông báo cho người gọi về các ngoại lệ có thể xảy ra khi gọi mã Kotlin từ Java, Swift hoặc Objective-C, bạn có thể sử dụng chú thích @Throws
.
3. Kiểu Nothing
throw
là một biểu thức trong Kotlin, vì vậy bạn có thể sử dụng nó, ví dụ, như một phần của biểu thức Elvis:
val s = person.name ?: throw IllegalArgumentException("Name required")
Biểu thức throw
có kiểu Nothing
. Kiểu này không có giá trị và được sử dụng để đánh dấu các vị trí mã không thể đạt đến được. Trong mã của bạn, bạn có thể sử dụng Nothing
để đánh dấu một hàm không bao giờ trả về:
fun fail(message: String): Nothing {
throw IllegalArgumentException(message)
}
Khi bạn gọi hàm này, trình biên dịch sẽ biết rằng việc thực hiện không tiếp tục qua cuộc gọi:
val s = person.name ?: fail("Name required")
println(s) // 's' is known to be initialized at this point
Bạn cũng có thể gặp kiểu này khi làm việc với suy luận kiểu. Phiên bản có thể là null
của kiểu này, Nothing?
, có đúng một giá trị có thể, đó là null
. Nếu bạn sử dụng null
để khởi tạo một giá trị của kiểu suy luận và không có thông tin khác có thể được sử dụng để xác định một kiểu cụ thể hơn, trình biên dịch sẽ suy luận kiểu Nothing?
:
val x = null // 'x' has type `Nothing?`
val l = listOf(null) // 'l' has type `List<Nothing?>
4. Tương tác với Java
Vui lòng xem phần về ngoại lệ trong trang Tương tác với Java để biết thông tin về tương tác với Java.
Cảm ơn mọi người đã dành thời gian đọc về “Kotlin với Ngoại lệ” tại Cafedev! Chúng tôi hy vọng rằng thông tin đã mang lại giá trị và sự hiểu biết sâu sắc về cách Kotlin xử lý ngoại lệ. Tại Cafedev, chúng tôi luôn khuyến khích sự tương tác và chia sẻ kiến thức giữa cộng đồng. Hãy tiếp tục theo dõi chúng tôi để cập nhật thông tin mới và tham gia vào các thảo luận sôi nổi. Cùng nhau, chúng ta xây dựng một cộng đồng Cafedev mạnh mẽ và phát triển!”
Các nguồn kiến thức MIỄN PHÍ VÔ GIÁ từ cafedev tại đây
Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của Cafedev để nhận được nhiều hơn nữa:
Chào thân ái và quyết thắng!