私は Java プロジェクトに取り組んでおり、このプロジェクト内で初めて Kotlin を試しました。Intellij Idea で提供されている 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 ...
}
}
}
例外が catch されない理由を誰か説明してもらえますか。MyCustomKotlinException
は Kotlins から継承していますRuntimeException
が、これは の単なるエイリアスですjava.lang.RuntimeException
。
// MyCustomKotlinException.kt
package foo
class MyCustomKotlinException(err: String) : RuntimeException(err)
アップデート:
throw 部分を 2 行 (インスタンス作成と throw) に分割したところ、問題は throw ではないことがわかりました。try ブロックはインスタンス作成後に残されています。この Kotlin クラスのインスタンス作成に何か問題がありますか?
アップデート2:
2 番目の catch ブロックを追加しThrowable
、次の Throwable がキャッチされます。
java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
...
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
アップデート3:
タイトルを変更してエラーを修正し、すべてのプロジェクト ファイルを jar に追加する際の問題を修正しました (以下の回答を参照)。Kotlin ランタイム ライブラリを gradle に追加しても機能しません。
ベストアンサー1
すべてのプロジェクトファイルを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.compileClasspath.collect { it.isDirectory() ? it : zipTree(it) } }
}
アップデート:configurations.compile.collect
に従ってconfigurations.compileClasspath.collect
変更これ下記に回答してください。