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;
}
我已经知道 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;
}