kotlin如何将检查异常更改为运行时异常?

Yu *_*Suk 2 exception runtimeexception kotlin

我已经知道 kotlin 中没有这样的“检查”异常。

但我想知道 kotlin 如何在内部将检查异常“转换”为运行时异常。

例如,当不存在此类文件时,下面的代码将从 java.io 包(而不是从 kotlin 包)抛出 FileNotFoundException。

var s = File("hello.txt").inputStream()
Run Code Online (Sandbox Code Playgroud)

当然,不需要显式添加 try-catch 块,但我很好奇它在内部是如何工作的。

我假设他们以某种方式将所有 java 检查的异常重新实现为 kotlin 友好的运行时异常,但我的猜测似乎不正确。

JB *_*zet 6

在运行时,检查异常与未检查异常没有什么不同。它们在 Java 中的不同之处在于 Java编译器处理它们的方式。它拒绝编译抛出已检查异常的代码,而无需在方法的 throws 子句中声明它。Kotlin 编译器根本没有这个规则,并且接受这样的源代码。

请注意,您实际上可以使用 Java 编译器进行欺骗并抛出已检查的异常,而无需在 throws 子句中声明它:

public void haha() {
    IOException e = new IOException();
    sneakyThrow(e);
}

private <E extends Exception> void sneakyThrow(Exception e) throws E {
    throw (E) e;
}
Run Code Online (Sandbox Code Playgroud)