为什么getMessage()在Kotlin中是一个未解析的引用,带有Exception类?

Sco*_*ter 4 kotlin

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

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

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

给我这个编译错误:

test_exception.kt:12:17: error: unresolved reference: getMessage
      println(e.getMessage())
                ^
Run Code Online (Sandbox Code Playgroud)

建议我使用从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)
   }
}
Run Code Online (Sandbox Code Playgroud)

我收到这条消息:

java.lang.Exception: something went wrong
Run Code Online (Sandbox Code Playgroud)

这似乎说Exception类不是Kotlin Exception类 - 但是java版本有一个getMessage()方法,当我尝试使用它时我不应该得到编译错误.

vod*_*dan 7

没有其他Throwable除外java.lang.Throwable.Java和Kotlin程序都使用此类.

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

TL; DR:

相当于e.getMessage()Kotlin e.message,在文档中描述为open val message: String?.

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