【问题标题】:Kotlin - NoSuchMethodError while instantiating ThrowableKotlin - 实例化 Throwable 时出现 NoSuchMethodError
【发布时间】:2015-12-08 23:13:21
【问题描述】:

尝试实例化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):

  • “Command + click”在 Java 类中 Throwable 将我带到 java.lang.Throwable 而在 Kotlin 类中,它会将我带到 Throwable.kt 中的 Throwable 定义
  • 我尝试使用val s = java.lang.Throwable(),但它甚至无法编译

我使用的是 Kotlin 版本1.0.0-beta-2423

我是否遗漏了一些非常明显的东西?

【问题讨论】:

  • 你试试如何java.lang.Throwable s = new java.lang.Throwable();
  • 它不会编译,因为它不是有效的 kotlin
  • 查看答案,您需要传递字符串和空值(我相信这是原因)。

标签: java android kotlin


【解决方案1】:

UPD:错误已修复,问题不应再重现。

这是 Kotlin 中的一个错误:https://youtrack.jetbrains.com/issue/KT-5910。作为一种解决方法,将两个参数都传递给Throwable 的构造函数。

【讨论】:

  • 我看到这已在 Beta 4 中得到修复(至少它不再对我崩溃了)。如果正确,能否请您更新一下youtrack中的状态?
  • @x-treme YT 问题自 2015 年 12 月 17 日起标记为已修复
  • 我认为某种信息会输入到跟踪器中,说明哪个版本带有修复(“修复版本”会是那个字段吗?)
【解决方案2】:

我第一次遇到kotlin 很有趣,乍一看,我以为你在混合使用 javascript 和 java,但实际上并非如此。

我查找了 kotlin 的文档,特别是 Throwable,有趣的是构造函数如下:

Throwable(message: String? = null, cause: Throwable? = null)

然后我查找了如何在 Kotlin 中初始化对象,吓人。并发现这个很棒的place 展示了如何声明对象和处理空值。我将 Throwable 声明如下:

//last arg as null - which is the cause
var a : Throwable =  Throwable("I am Throwable - Kotlin vesion.", null)

当我在在线 kotlin compiler/interpretor 中尝试它时没有任何错误,然后我将其打印如下:

 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

【讨论】:

  • Throwable("test", null) 可以工作,而Throwable("test")Throwable() 不行!令人困惑..
  • 我猜 Kotlin 总是希望有一个 Throwable 的原因,即使它为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-02
相关资源
最近更新 更多