2017-06-17 39 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

相關問題