我正在研究一个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 ...
}
}
}
所以任何人都可以向我解释为什么异常不会被捕获。 MyCustomKotlinException
继承自Kotlins RuntimeException
,它只是java.lang.RuntimeException
的别名。
// MyCustomKotlinException.kt
package foo
class MyCustomKotlinException(err: String) : RuntimeException(err)
更新
我将throw部分分成2行(实例创建和抛出),发现问题不在于抛出。在创建实例后留下try块。我的Kotlin类的实例创建有什么问题吗?
UPDATE2:
我添加了第二个带有Throwable
的catch块,并且捕获了以下Throwable。
java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
...
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
UPDATE3:
将标题更改为正确错误并修复了将所有项目文件添加到jar中的问题(请参阅下面的答案)。
将Kotlin运行时库添加到gradle对我来说不起作用。
答案 0 :(得分:16)
将所有项目文件添加到jar中为我解决了问题。我将以下行添加到build.gradle
jar {
manifest {
attributes ...
}
// This line of code recursively collects and copies all of a project's files
// and adds them to the JAR itself. One can extend this task, to skip certain
// files or particular types at will
from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
}
答案 1 :(得分:16)
您需要使用kotlin配置项目。 所以在Android Studio中:
点击工具=&gt; kotlin =&gt;在项目中配置kotlin
然后在对话框中检查:包含kotlin文件的所有模块
并选择版本
按ok
完成。
答案 2 :(得分:4)
我要说你在没有GridSearchCV
库的情况下尝试运行Kotlin代码
检查您正在使用的系统并添加必要的jar文件。您可以通过将项目打包到kotlin-runtime
文件并使用runtime library
答案 3 :(得分:3)
此错误很可能是由于简单的jar任务并没有兼顾其所有运行时依赖性。
从gradle documentation的build.gradle.kts
中,您可以创建“ fatJar”任务,也可以将其添加到jar任务中:
tasks.withType<Jar> {
// Otherwise you'll get a "No main manifest attribute" error
manifest {
attributes["Main-Class"] = "com.example.MainKt"
}
// To add all of the dependencies
from(sourceSets.main.get().output)
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
})
}
答案 4 :(得分:2)
有同样的问题,在控制台中使用Ant编译我的项目。我把kotlin-stdlib.jar编辑成了classpath,问题已经消失了。
答案 5 :(得分:1)
添加以下内容为我解决了这个问题:
dependencies {
"kotlinCompilerClasspath"(fileTree("libs/gradle-plugins/kotlin"))
}
这是libs/gradle-plugins/kotlin
的内容:
annotations-13.0.jar
commons-codec-1.9.jar
commons-logging-1.2.jar
gradle-download-task-3.4.3.jar
gson-2.8.5.jar
httpclient-4.5.3.jar
httpcore-4.4.6.jar
kotlin-android-extensions-1.3.40.jar
kotlin-annotation-processing-gradle-1.3.40.jar
kotlin-build-common-1.3.40.jar
kotlin-compiler-1.3.40.jar
kotlin-compiler-embeddable-1.3.40.jar
kotlin-compiler-runner-1.3.40.jar
kotlin-daemon-client-1.3.40.jar
kotlin-gradle-plugin-1.3.40.jar
kotlin-gradle-plugin-api-1.3.40.jar
kotlin-gradle-plugin-model-1.3.40.jar
kotlin-reflect-1.3.40.jar
kotlin-runtime-1.2.71.jar
kotlin-script-runtime-1.3.40.jar
kotlin-scripting-common-1.3.40.jar
kotlin-scripting-compiler-embeddable-1.3.40.jar
kotlin-scripting-compiler-impl-embeddable-1.3.40.ja
kotlin-scripting-jvm-1.3.40.jar
kotlin-stdlib-1.3.40.jar
kotlin-stdlib-common-1.3.40.jar
kotlin-stdlib-jdk7-1.3.40.jar
kotlin-stdlib-jdk8-1.3.40.jar
kotlinx-coroutines-core-1.1.1.jar
org.jetbrains.kotlin.jvm.gradle.plugin-1.3.40.jar
trove4j-1.0.20181211.jar
完整的gradle.build.kts
(离线设置):
buildscript {
dependencies {
classpath(fileTree("libs/gradle-plugins/kotlin"))
}
}
plugins {
java
`java-library`
}
apply(plugin = "kotlin")
version = "2019.06.1"
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile> {
kotlinOptions.jvmTarget = "12"
}
repositories {
flatDir {
dirs("libs/compile")
dirs("libs/provided")
}
}
dependencies {
"kotlinCompilerClasspath"(fileTree("libs/gradle-plugins/kotlin"))
compileOnly(":javaee-api-8.0")
api(":kotlin-stdlib-common-1.3.40")
api(":kotlin-stdlib-1.3.40")
api(":kotlin-stdlib-jdk7-1.3.40")
api(":kotlin-stdlib-jdk8-1.3.40")
api(":gson-2.8.5")
}
答案 6 :(得分:0)
就我而言,在迁移到Kotlin 1.3时,settings.gradle中的enableFeaturePreview
导致了此问题。
答案 7 :(得分:-1)
感谢您的评论。实际上compile
已过时。但是,接受的答案不适用于implementation
。因此,我查找了java library plugin configuration和implementation
取决于compileClasspath。
所以我目前的解决方案是添加
jar {
manifest {
attributes ...
}
// This line of code recursively collects and copies all of a project's files
// and adds them to the JAR itself. One can extend this task, to skip certain
// files or particular types at will
from { configurations.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}
与
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.50"
//...
}
我觉得这应该由org.jetbrains.kotlin.jvm插件完成。
在build.gradle文件的依赖项中使用 compile
代替implementation
为我解决了这个问题。