Kotin documentation says“Kotlin中的所有异常类都是类Throwable的后代。每个异常都有消息,堆栈跟踪和可选原因。”
The Java documentation for Throwable显示了一个getMessage()方法。但是Kotlin documentation for Throwable没有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 Exception类 - 但是java版本有一个getMessage()方法,当我尝试使用它时我不应该得到编译错误。
答案 0 :(得分:6)
除了Throwable
之外,没有其他java.lang.Throwable
。这个类由Java和Kotlin程序使用。
Throwable
在Kotlin文档中有一个条目的事实表明这是一个特殊的编译器&#34;别名&#34;。这意味着,对于所有意图和目的,它是一个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