MST
星途 面试题库

面试题:Kotlin异常处理中的自定义异常

在Kotlin中如何自定义一个异常类?并阐述自定义异常在实际项目中何时以及为何使用,举例说明自定义异常类在业务逻辑中的处理流程。
16.5万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试
  1. 自定义异常类: 在Kotlin中,自定义异常类需要继承自Exception类(如果是可恢复的异常)或者Throwable类(一般用于不可恢复的错误,如Error类型相关,不过通常自定义异常继承Exception)。
    class MyCustomException(message: String) : Exception(message)
    
    也可以给自定义异常类添加更多属性和方法,例如:
    class MyCustomException(message: String, val errorCode: Int) : Exception(message) {
        fun printErrorCode() {
            println("Error code: $errorCode")
        }
    }
    
  2. 何时以及为何使用
    • 何时使用:当标准库提供的异常类不能准确描述项目中特定的错误情况时,就需要自定义异常。例如,在一个电商系统中,可能存在“库存不足”的错误情况,标准异常无法精准描述这种业务相关的错误,此时就可自定义异常。
    • 为何使用:自定义异常可以让代码的错误处理更加清晰和准确。它能够使调用者根据特定的异常类型进行针对性的处理,提高代码的健壮性和可维护性。比如在一个支付系统中,自定义“支付渠道不可用异常”,可以让调用支付功能的代码能够明确知道是支付渠道方面的问题,而不是一个笼统的异常。
  3. 业务逻辑中的处理流程举例: 假设我们有一个图书管理系统,在借书功能中,如果书的库存不足,需要抛出自定义异常。
    class Book(val title: String, var stock: Int)
    
    class OutOfStockException(message: String) : Exception(message)
    
    class Library {
        private val books = mutableListOf<Book>()
    
        fun addBook(book: Book) {
            books.add(book)
        }
    
        fun borrowBook(title: String) {
            val book = books.find { it.title == title }
            book?.let {
                if (it.stock > 0) {
                    it.stock--
                    println("$title borrowed successfully.")
                } else {
                    throw OutOfStockException("$title is out of stock.")
                }
            }?: throw IllegalArgumentException("$title is not in the library.")
        }
    }
    
    fun main() {
        val library = Library()
        val book1 = Book("Kotlin in Action", 5)
        library.addBook(book1)
        try {
            library.borrowBook("Kotlin in Action")
            library.borrowBook("Kotlin in Action")
            library.borrowBook("Kotlin in Action")
            library.borrowBook("Kotlin in Action")
            library.borrowBook("Kotlin in Action")
            library.borrowBook("Kotlin in Action")
        } catch (e: OutOfStockException) {
            println("Error: ${e.message}")
        } catch (e: IllegalArgumentException) {
            println("Error: ${e.message}")
        }
    }
    
    在上述代码中,borrowBook方法在库存不足时抛出OutOfStockException自定义异常,在main函数中通过try - catch块捕获并处理这个异常,向用户展示友好的错误信息。