【发布时间】:2017-05-26 08:56:54
【问题描述】:
我正在开发一个 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 行(实例创建和 throwing),发现问题不在于 throwing。实例创建后会留下 try 块。我创建这个 Kotlin 类的实例有什么问题吗?
更新 2:
我用 Throwable 添加了第二个 catch 块,然后捕获了以下 Throwable。
java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
...
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
更新3:
将标题更改为更正错误并修复了将所有项目文件添加到 jar 的问题(请参见下面的答案)。
将 Kotlin 运行时库添加到 gradle 对我不起作用。
【问题讨论】:
-
请提供完整的minimal reproducible example,例如带有那个kotlin源代码。
-
@GhostCat 这对你来说够了吗?
-
它需要足够多,以便人们可以重现该问题。看起来像现在。
-
@FreshD 我无法使用您提供的代码重现该问题。
-
@Christian 是的,你是对的。我刚刚尝试了这个例子,它可以工作。但是异常类看起来相同,但名称不同,并且 try catch 中的实例创建也是相同的,所以不知道为什么它只适用于示例。
标签: java exception exception-handling kotlin