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

One Solution collect form web for “为什么getMessage()是一个Exception类的Kotlin未解决的引用?”

没有其他的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

  • 警告:类路径中的Kotlin运行时JAR文件应该具有相同的版本
  • 用匕首在Kotlin中注入Generic类型2
  • 如何使用kotlin数据类获取Firestore文档的文档ID
  • 为什么使用Kotlin“by”通过匿名子类?
  • 在kotlin / spring引导中使用Gradle属性扩展
  • Xamarin Android和Kotlin库
  • 多部分请求与改进@PartMap错误Kotlin(Android)
  • Kotlin:可空的财产代表可观察
  • Kotlin的gradle插件不适用于自定义源集(JMH)
  • 预期诠释,得到IntProgression代替
  • Kotlin val差异getter覆盖vs分配
  • Kotlin language will be the best programming language for Android.