面试题答案
一键面试- 自定义异常类:
在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") } }
- 何时以及为何使用:
- 何时使用:当标准库提供的异常类不能准确描述项目中特定的错误情况时,就需要自定义异常。例如,在一个电商系统中,可能存在“库存不足”的错误情况,标准异常无法精准描述这种业务相关的错误,此时就可自定义异常。
- 为何使用:自定义异常可以让代码的错误处理更加清晰和准确。它能够使调用者根据特定的异常类型进行针对性的处理,提高代码的健壮性和可维护性。比如在一个支付系统中,自定义“支付渠道不可用异常”,可以让调用支付功能的代码能够明确知道是支付渠道方面的问题,而不是一个笼统的异常。
- 业务逻辑中的处理流程举例:
假设我们有一个图书管理系统,在借书功能中,如果书的库存不足,需要抛出自定义异常。
在上述代码中,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
块捕获并处理这个异常,向用户展示友好的错误信息。