🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## [kotlin.Nothing](https://www.w3cschool.cn/doc_kotlin/kotlin-api-latest-jvm-stdlib-kotlin--nothing.html) 在Kotlin类型层次结构的最底层就是类型 Nothing ![](https://box.kancloud.cn/e535e1e2b81c3013f942ee8490eca1e0_373x315.png) Kotlin中没有类似Java和C中的函数没有返回值的标记 void ,但是**拥有一个对应 Nothing** 。在Java中,返回 void 的方法,其返回值 void 是无法被访问到的。 在Java中, void 不能是变量的类型。也不能被当做值打印输出。但是,在Java中有个包装类 Void 是 void 的自动装箱类型。如果你想让一个方法返回类型 永远是 null 的话, 可以把返回类型置为这个大写的V的 Void 类型。 >[info]【注意】:Unit与Nothing之间的区别: Unit类型表达式计算结果的返回类型是Unit。Nothing类型的表达式计算结果是永远不会返回的(跟Java 中的 void 相同)。 * 正如它的名字Nothing所暗示的, **Nothing 是没有实例的类型** ![](https://box.kancloud.cn/8ef36c1ae43c38eb1b89cdbe6eb67d29_531x126.png) 源码如下 ~~~ package kotlin /** * Nothing has no instances. You can use Nothing to represent "a value that never exists": for example, * if a function has the return type of Nothing, it means that it never returns (always throws an exception). */ public class Nothing private constructor() ~~~ 从上面的源码我们可以知道:Nothing是没有实例的。您可以使用Nothing来表示“一个不存在的值”:例如,如果一个函数的返回类型为Nothing,这意味着它永远不会返回(总是抛出异常)。 ### Nothing?可以只包含一个值:null Nothing? 它唯一允许的值是 null ,被用作任何可空类型的 空引用。 示例 ![](https://box.kancloud.cn/c56b98efeb26ed26b43215ffd5c6b242_1015x296.png) 综上所述,我们可以看出Kotlin有一个简单而一致的类型系统。 Any? 是整个类型体系的顶部, Nothing 是底部。如下图所示: ![](https://box.kancloud.cn/1529100e1156c6c02397dec2060483c1_814x678.png) ### **PS:备注** 对某些Kotlin 函数来说,"返回类型”的概念没有任何意义,因为它们从来不会成功地结束。例如, 许多测试库都有一个叫作fail 的函数,它通过抛出带有特定消息的异常来让当前测试失败。一个包含无限循环的函数也永远不会成功地结束。 当分析调用这样函数的代码时,知道函数永远不会正常终止是很有帮助的。Kotlin 使用一种特殊的返回类型Nothing 来表示: ``` fun main(args: Array<String>) { fail("Error occurred") } fun fail(message:String):Nothing{ throw IllegalStateException(message) } ``` 运行结果如下 ``` Exception in thread "main" java.lang.IllegalStateException: Error occurred at A基础.NothingDemoKt.fail(NothingDemo.kt:19) at A基础.NothingDemoKt.main(NothingDemo.kt:15) ``` Nothing 类型没有任何值, 只有被当作函数返回值使用,或者被当作泛型函数返回值的类型参数使用才会有意义。在其他所有情况下,声明一个不能存储任何值的变量没有任何意义。 >[info]【注意】,返回Nothing 的函数可以放在Elvis 运算符的右边来做先决条件检查: ``` val address =company.address ?: fail("No address") println(address.city) ``` 上面这个例子展示了在类型系统中拥有Nothing 为什么极其有用。编译器知道这种返回类型的函数从不正常终止, 然后在分析调用这个函数的代码时利用这个信息。在上面这个例子中,编译器会把address 的类型推断成非空,因为它为null 时的分支处理会始终抛出异常。