kotlin require和assert 区别

发布于:2024-06-27 ⋅ 阅读:(22) ⋅ 点赞:(0)

在 Kotlin 中,require 和 assert 是两种用于验证条件的方法,主要区别在于它们的使用场景和触发机制。

require

require 用于函数参数的验证。如果条件不满足,它会抛出 IllegalArgumentException 异常。这通常用于对公共 API 的输入参数进行检查,以确保它们符合预期。

fun calculateArea(width: Int, height: Int): Int {
    require(width > 0) { "Width must be positive" }
    require(height > 0) { "Height must be positive" }
    return width * height
}

assert

assert 用于检查程序中的某些条件是否成立,只在调试模式下有效。如果条件不满足,它会抛出 AssertionError 异常。这通常用于开发和测试阶段,确保程序逻辑的正确性。

fun calculateArea(width: Int, height: Int): Int {
    assert(width > 0) { "Width must be positive" }
    assert(height > 0) { "Height must be positive" }
    return width * height
}

具体区别

  1. 用途不同:
    • require 用于参数验证,常用于函数的前置条件检查,确保输入值合法。
    • assert 用于内部逻辑检查,常用于调试和测试阶段,确保代码逻辑正确。
  2. 触发异常类型不同:
    • require 触发 IllegalArgumentException 异常。
    • assert 触发 AssertionError 异常。
  3. 运行环境不同:
    • require 在所有环境下都有效,无论是调试模式还是发布模式。
    • assert 仅在调试模式下有效。在 JVM 中,断言必须通过 -ea 参数显式启用。
  4. 使用场景不同:
    • require 通常用于公共 API 或者函数入口,保证外部传入的参数满足要求。
    • assert 通常用于内部逻辑验证,确保在开发过程中发现逻辑错误。

示例

require 示例

fun divide(a: Int, b: Int): Int {
    require(b != 0) { "Denominator must not be zero" }
    return a / b
}

fun main() {
    println(divide(10, 2)) // 输出: 5
    println(divide(10, 0)) // 抛出 IllegalArgumentException: Denominator must not be zero
}

assert 示例

fun factorial(n: Int): Int {
    assert(n >= 0) { "n must be non-negative" }
    return if (n == 0) 1 else n * factorial(n - 1)
}

fun main() {
    println(factorial(5)) // 输出: 120
    println(factorial(-1)) // 在调试模式下抛出 AssertionError: n must be non-negative
}