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

How kotlin changes checked exception to runtime exception?

我已经知道 kotlin 中没有这样的 "checked" 异常。

但我想知道 kotlin 如何在内部 "transform" 检查异常到运行时异常。

例如,当没有这样的文件时,下面的代码将从 java.io 包(而不是 kotlin 包)中抛出 FileNotFoundException。

var s = File("hello.txt").inputStream()

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

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

已检查的异常在运行时与未检查的异常没有什么不同。 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;
}