monkeyWie
0.65D
V2EX  ›  Java

JVM 是不是给 kotlin 开了后门啊

By monkeyWie at 2023 年 6 月 7 日 · 5561 次点击

我是 kotlin 新手,请各位大佬指教下,就是在 kotlin 编写的方法里抛了 IOException ,在 java 里面调用的时候可以不用强制捕获,这是怎么做到的。

比如在 kt 里抛一个异常,java 里可以直接调用并不用处理异常

  • kt
fun test() {
  throw IOException("test")
}
  • java
public static void main(String[] args) {
  test();
}

按我的理解 kotlin 应该会把 checked exception 转换成 runtime exception ,这样才符合 java 的规范,但是实际上我把异常捕获下来发现 catch 住的还是 IOException ,并没有做转化

  • java
public static void main(String[] args) {
  try {
    test();
  }catch (Exception e) {
    System.out.println(e.getClass());
    // 打印 IOException
  }
}

这有什么黑魔法在里面吗?

10 条回复  •  2023-06-08 14:34:14 +08:00
Bromine0x23
   1
Bromine0x23  
   2023 年 6 月 7 日   ❤️ 1
bkmi
   2
bkmi  
   2023 年 6 月 7 日 via Android
你在代码里写 throw 编译器不会给你检查的,你需要在方法上用注解声明抛出异常
@Throws(IOException::class)
monkeyWie
   3
monkeyWie  
OP
   2023 年 6 月 7 日
@Bromine0x23 哈哈,确实,看样子是绕过编译器检测了


guxingke
   4
guxingke  
   2023 年 6 月 7 日   ❤️ 1
JVM 并不区分 checked or unchecked exception , 完全编译器开发者的倾向

-----
Kotlin 确实是 better java
monkeyWie
   5
monkeyWie  
OP
   2023 年 6 月 7 日
@guxingke 确实,好像官方都承认了当时设计 checked exception 是一个败笔
yazinnnn
   6
yazinnnn  
   2023 年 6 月 7 日
checked exception 不能算败笔
Bromine0x23
   7
Bromine0x23  
   2023 年 6 月 7 日
@monkeyWie 看来还是搞错了,checked exception 只是编译期的
Leviathann
   8
Leviathann  
   2023 年 6 月 7 日   ❤️ 3
@yazinnnn 本意是好的,被类型系统执行歪了
agagega
   9
agagega  
   2023 年 6 月 7 日
Swift 的异常设计得比 Java 好点,一个函数只区分 throws 还是不 throws ,没有什么 checked exception
hrong
   10
hrong  
   2023 年 6 月 8 日
checked exception 有时候做逻辑控制还是挺有用的,比返回值要方便
© 2026 V2EX · 33ms · 3.9.8.5