为什么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