我正在做一个Java项目,在这个项目中,我第一次尝试使用Kotlin。我开始用Intellij Idea中提供的JavaToKoltin转换器将一些类转换为Kotlin。其中,我的自定义异常现在被转换为Kotlin。但是这样一来,异常处理就不能正常工作了。
如果我在java代码中抛出一个自定义异常(例如MyCustomKotlinException.kt
),则不会捕获该异常(请参见下面的代码)。
// Example.java
package foo
import java.util.*;
import java.lang.*;
import java.io.*;
import foo.MyCustomKotlinException;
class Example
{
public static void main (String[] args)
{
try {
// Do some stuff
// if Error
MyCustomKotlinException e = new MyCustomKotlinException("Error Message");
throw e;
} catch (MyCustomKotlinException e) { // <-- THIS PART IS NEVER REACHED
// Handle Exception
} catch (Throwable e) {
e.printStackTrace(); <-- This is catched
} finally {
// Finally ...
}
}
}
那么,有人能向我解释一下为什么这个异常不是catch吗?MyCustomKotlinException
是从Kotlins RuntimeException
继承的,它只是java.lang.RuntimeException
的一个别名。
// MyCustomKotlinException.kt
package foo
class MyCustomKotlinException(err: String) : RuntimeException(err)
更新日期:
我把throw部分分成了2行(示例创建和throw),发现问题不在于throw。try块在示例创建之后留下了。我这个Kotlin类的示例创建有什么问题吗?
更新2:
我用Throwable
添加了第二个catch块,并捕获了下面的Throwable。
java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
...
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
更新3:
修改了标题以更正错误,并修复了将所有项目文件添加到jar的问题(请参见下面的答案)。
8条答案
按热度按时间zfciruhq1#
将所有项目文件添加到jar中为我解决了这个问题。
更新:根据下面的this答案,将
configurations.compile.collect
更改为configurations.compileClasspath.collect
。noj0wjuj2#
您需要使用Kotlin配置您的项目。因此,在Android Studio中:
1.单击工具=〉Kotlin=〉在项目中配置kotlin
1.然后在对话框中检查:包含Kotlin文件的所有模块
1.并选择版本
1.按OK
好了,好了
k97glaaz3#
此错误可能是由于简单的jar任务没有获取其所有的运行时依赖项。
从gradle文档中,您可以在
build.gradle.kts
中创建一个“fatJar”任务或将其添加到jar任务中:aiazj4mn4#
我要说的是,您试图在没有
kotlin-runtime
库的情况下运行Kotlin代码检查您正在使用的系统并添加必要的jar文件。
plicqrtu5#
谢谢你的评论。确实
compile
是不赞成的。但是接受的答案不适用于implementation
。所以我查了一下java库插件的配置,implementation
依赖于compileClasspath。现在我的解决方案是
与
我觉得这应该由org.jetbrains.Kotlin插件来完成。
在build.gradle文件的依赖项中使用
compile
而不是implementation
,我就解决了这个问题。pcrecxhr6#
在控制台中用Ant编译我的项目时也遇到了同样的问题。我已经把kotlin-stdlib.jar插入到类路径中,问题就消失了。
j0pj023g7#
添加以下内容为我解决了这个问题:
下面是
libs/gradle-plugins/kotlin
的内容:完整的
gradle.build.kts
(离线设置):mum43rcc8#
在我的例子中,在迁移到Kotlin1.3时,settings.gradle中的
enableFeaturePreview
导致了这个问题。