Xử lý ngoại lệ trong Kotlin (Bài 9)
Xử lý ngoại lệ trong Kotlin cũng tượng như trong Java. Và chúng ta đều biết, ngoại lệ là những lỗi có thể phát sinh lúc thực thi. Chẳng hạn như đọc một file không còn tại. Hoặc kết nối với database không có sẵn.
Ngoại lệ không phải lúc nào cũng xảy ra mà tùy thuộc vào thời điểm chương trình chạy. Ví dụ chương trình nhập vào 2 số nguyên sau đó tính tổng chẳng hạn. Nếu người dùng lúc nào cũng nhập vào 2 số nguyên thì chương trình hoạt động bình thường. Tuy nhiên nếu một ngày nào đó, người dùng nhập vào ký tự thì chương trình có thể phát sinh ngoại lệ.
Do đó, việc xử lý ngoại lệ trong lúc lập trình đối với các lập trình viên là điều vô cùng cần thiết để đảm bảo chương trình luôn hoạt động tốt trong mọi tình huống.
Xử lý ngoại lệ trong Kotlin – Cú pháp
try { Xử lý } catch (e: ExceptionName) { Xử lý ngoại lệ } finally { Giải phóng tài nguyên }
Để ném ra ngoại lệ chúng ta sử dụng throw. Tuy nhiên để bắt ngoại lệ, chúng ta sử dụng try…catch như trên. Đối với finally có thể bỏ qua khi viết try…catch và những câu lệnh bên trong nó luôn luôn được thực thi bất kể cho xảy ra ngoại lệ hay không.
Sau đây là một số exception thông dụng
- ArithmeticException: Ngoại lệ liên quan đến tính toán số học
- NumberFormatException: Ngoại lệ liên quan đến định dạng số
- IllegalArgumentException: Ngoại lệ liên quan đến đối số không phù hợp
- Exception: Ngoại lệ tổng quát nhất
Khi xử lý ngoại lệ, chúng ta có thể chỉ định cụ thể từng ngoại lệ trên hoặc sử dụng Exception.
Xử lý ngoại lệ trong Kotlin – Ví dụ
fun main(args: Array<String>) { try { val age:Int = 12 val name:String = "Lê Hồng Kỳ" name.toInt() } catch(e:Exception) { e.printStackTrace() } finally { println("Xử lý ngoại lệ trong Kotlin") } }
Khi chạy ví dụ trên, chương trình sẽ phát sinh một ngoại lệ tại dòng name.toInt() vì không thể chuyển một chuỗi sang dạng số int được. Với chương trình trên, nếu không xử lý ngoại lệ thì chương trình sẽ phát sinh lỗi và kết thúc bất thường.
Xử lý ngoại lệ trong Kotlin – Kết luận
Khi lập trình, các lập trình viên phải lưu ý sẽ phải đặt những đoạn code có thể phát sinh lỗi thực thi vào trong try…catch nếu không muốn chương trình của mình có thể kết thúc bất thường lúc chạy.
Trong một khối try…catch, chúng ta có thể lòng nhiều catch. Điều này đồng nghĩa với việc, câu lệnh nào phát sinh lỗi trước sẽ vào catch tương ứng.
fun main(args: Array<String>) {
try {
var num: Int
var tmp = "Gia Su Tin Hoc"
num = tmp.toInt()
var result = num / 0
} catch (nfe: NumberFormatException) {
nfe.printStackTrace()
println("Khong phai so")
} catch (ae: ArithmeticException) {
ae.printStackTrace()
println("\nKhong chia duoc cho 0")
}
}
Khi chạy đoạn code trên, chương trình sẽ phát sinh ngoại lệ NumberFormatException vì không thể chuyển một chuỗi “Gia Su Tin Hoc” thành một số
Như các bạn thấy, mặc dù chúng tôi sử dụng 2 ngoại lệ khi viết try…catch. Tuy nhiên khi chạy chương trình thì lệnh name.toInt() phát sinh lỗi nên catch (nfe: NumberFormatException) sẽ được thực hiện.
Cũng đoạn code trên và được sửa lại như bên dưới thì khi chạy chương trình thì ngoại lệ sẽ vào catch (ae: ArithmeticException) vì không thể chia cho số 0.
fun main(args: Array<String>) {
try {
var num: Int
var tmp = "10"
num = tmp.toInt()
var result = num / 0
} catch (nfe: NumberFormatException) {
nfe.printStackTrace()
println("Khong phai so")
} catch (ae: ArithmeticException) {
ae.printStackTrace()
println("\nKhong chia duoc cho 0")
}
}
Phát sinh ngoại lệ