2017-06-17 27 views
3

Kotin documentation says“Kotlin中的所有异常类都是Throwable类的后代,每个异常都有消息,堆栈跟踪和可选原因。”为什么getMessage()在Kotlin中有一个Exception类的未解析引用?

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()) 
       ^

暗示我使用从科特林的Throwable类派生的科特林Exception类。

但是,如果我改变的getMessage()来的toString(),并添加一个扔:

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版本,当我尝试使用它时,我不应该得到编译错误。

回答

5

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

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

TL; DR:

e.getMessage()在科特林等效是e.message,其在该文档作为open val message: String?说明。

由于Throwable不是从Java直接使用,而是映射到Kotlin,因此无法使用Java符号e.getMessage()作为属性。下面是关于地图类型的更多信息:http://kotlinlang.org/docs/reference/java-interop.html#mapped-types

相关问题