尝试实例化Throwable
的对象会引发以下错误
java.lang.NoSuchMethodError: No direct method <init>(Ljava/lang/String;Ljava/lang/Throwable;ILkotlin/jvm/internal/DefaultConstructorMarker;)V in class Ljava/lang/Throwable; or its super classes (declaration of 'java.lang.Throwable' appears in /system/framework/core-libart.jar)
我尝试过的不同方法是:
val s = Throwable()
val t = Throwable("This is a message")
我观察到的一些事情(在Mac上使用Android Studio):
- 在Java类中,对
Throwable
执行"命令+单击"会将我带到java.lang.Throwable
,而在Kotlin类中,它会将我带入Throwable.kt
中的Throwable
定义 - 我尝试使用
val s = java.lang.Throwable()
,但它甚至无法编译
我使用的是Kotlin版本1.0.0-beta-2423
我是不是错过了一些显而易见的东西?
UPD:错误已修复,问题不应再重复。
这是Kotlin中的一个错误:https://youtrack.jetbrains.com/issue/KT-5910.作为一种变通方法,将两个参数都传递给Throwable
的构造函数。
我第一次看到kotlin
很有趣,乍一看我以为你在混合javascript和java,但事实并非如此。
我查阅了kotlin的文档,特别是Throwable的文档,有趣的是,构造函数如下:
Throwable(message: String? = null, cause: Throwable? = null)
然后我在Kotlin中查找了如何初始化对象,很可怕。发现这个伟大的地方展示了如何声明对象和处理null值。我宣布投掷如下:
//last arg as null - which is the cause
var a : Throwable = Throwable("I am Throwable - Kotlin vesion.", null)
当我在在线kotlin编译器/解释器中尝试它时,它没有任何错误,然后我打印如下:
print(a)
print(a.printStackTrace())
我得到了以下输出:
java.lang.Throwable: I am Throwable - Kotlin vesion.
接下来是printStackTrace()的结果,如下所示:
java.lang.Throwable: I am Throwable - Kotlin vesion.
at Simplest_versionKt.main(Simplest version.kt:9)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.jetbrains.webdemo.executors.JavaExecutor.main(JavaExecutor.java:46)
kotlin.Unit