私はJavaプロジェクトに取り組んでおり、このプロジェクト内でKotlinを初めて試しました。IntellijIdeaで提供されるJavaToKoltinコンバーターを使用して、一部のクラスをKotlinに変換し始めました。例外はKotlinに変換されるようになりましたが、これにより例外処理が正しく機能しなくなりました。
Javaコード内でカスタム例外の1つ(たとえば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)
更新:
スロー部分を2行に分割し(インスタンスの作成とスロー)、問題はスローではないことがわかりました。 tryブロックは、インスタンスの作成後に残ります。このKotlinクラスのインスタンス作成に問題はありませんか?
pdate2:Throwable
を含む2番目のcatchブロックを追加すると、次のThrowableがキャッチされます。
Java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
...
Caused by: Java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
pdate3:
タイトルを変更してエラーを修正し、すべてのプロジェクトファイルをjarに追加する際の問題を修正しました(以下の回答を参照)。 Kotlinランタイムライブラリをgradleに追加しても機能しません。
すべてのプロジェクトファイルを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) } }
}
Kotlinを使用してプロジェクトを構成する必要があります。だからAndroid Studio:
[ツール] => [kotlin] => [kotlinをプロジェクトで構成]をクリックします。
次にダイアログチェックで:kotlinファイルを含むすべてのモジュール
バージョンを選択します
oKを押します
できた.
kotlin-runtime
ライブラリなしでKotlinコードを実行しようとしていると言います
使用しているシステムを確認し、必要なjarファイルを追加します。これが問題であることを確認するには、プロジェクトを.jar
ファイルにパッケージ化し、 runtime library で実行します
コンソールでAntを使用してプロジェクトをコンパイルすると、同じ問題が発生しました。 kotlin-stdlib.jarをクラスパスに追加しましたが、問題はなくなりました。
以下を追加することで問題が解決しました:
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")
}
コトリンの「組み込み」を解決します
これらのライブラリをgradleファイルに追加
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.41'
implementation 'nl.dionsegijn:konfetti:1.1.2'
私の場合、Kotlin 1.3への移行時にsettings.gradleのenableFeaturePreview
が原因でこの問題が発生しました。