为什么getMessage()是一个Exception类的Kotlin未解决的引用?

Kotin文档说 :“Kotlin中的所有异常类都是Throwable类的后代,每个异常都有一个消息,堆栈跟踪和一个可选的原因。

Throwable的Java文档显示了一个getMessage()方法。 但是Throwable的Kotlin文档没有getMessage()。 所以这个代码:

fun main(args: Array<String>) { try { println("args size: ${args.size}"); } catch (e: Exception) { println(e.getMessage()) System.exit(1) } } 

给我这个编译错误:

 test_exception.kt:12:17: error: unresolved reference: getMessage println(e.getMessage()) ^ 

这表明我正在使用派生自Kotlin Throwable类的Kotlin Exception类。

但是,如果我将getMessage()更改为toString()并添加一个throw:

 fun main(args: Array<String>) { try { println("args size: ${args.size}"); throw Exception("something went wrong") } catch (e: Exception) { println(e.toString()) System.exit(1) } } 

我得到这个消息:

 java.lang.Exception: something went wrong 

这似乎是说,Exception类不是一个Kotlin异常类 – 但有一个getMessage()方法的Java版本,我不应该得到一个编译错误,当我尝试使用它。

没有其他的Throwable除了java.lang.Throwable 。 这个类被Java和Kotlin程序使用。

Throwable在Kotlin文档中有一个条目,这表明这是一个特殊的编译器“别名”。 这意味着对于所有的意图和目的,它是一个Kotlin类,其实例由java.lang.Throwable表示。 黑魔法。

TL; DR:

在Kotlin中e.getMessage()的等价物是e.message ,在文档中将其描述为open val message: String?

由于Throwable不是直接从Java中使用,而是映射到Kotlin,所以不能使用Java记法e.getMessage()作为属性。 以下是关于映射类型的更多信息: http : //kotlinlang.org/docs/reference/java-interop.html#mapped-types