2017-05-26 60 views
8

我工作的一个Java项目,这个项目我做了我第一次尝试科特林内。我开始使用Intellij Idea中提供的JavaToKoltin转换器将一些类转换为Kotlin。其中我的自定义例外现在转换为Kotlin。但是由于这种情况,异常处理不再正确工作。
如果我在java代码中抛出一个自定义异常(例如MyCustomKotlinException.kt),则不会捕获异常(请参阅下面的代码)。摇篮项目:java.lang.NoClassDefFoundError:科特林/ JVM /内部/内部函数

// 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类的实例创建有什么问题吗?

UPDATE2:
我添加了一个第二catch块与Throwable和下面的Throwable被捕获。

java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics 
... 
Caused by: java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics 

UPDATE3:
改变了标题纠正错误和固定的问题,将所有项目文件的jar(见下面的回答)。 将Kotlin运行库lib添加到gradle对我来说不起作用。

+0

请提供一个完整的[mcve],例如kotlin源代码。 – GhostCat

+0

@GhostCat对你来说就够了吗? – FreshD

+0

它必须足够让人们可以重现问题。看起来像现在。 – GhostCat

回答

4

将所有项目文件添加到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) } } 
} 
0

我会说,你想不kotlin-runtime

检查你使用的系统运行科特林代码并添加neccesary jar文件。您可以通过将您的项目打包到.jar文件并使用它运行

+0

我试图将运行时库添加到我的'build.gradle'('compile“org.jetbrains.kotlin:kotlin-runtime:$ kotlin_version”'),但对我无效。 – FreshD

2

您需要配置与科特林项目。 所以在Android的工作室:

  1. 点击工具=>科特林=>在项目对话框检查配置科特林

  2. 然后:含科特林文件

  3. ,并选择版本

  4. 所有模块
  5. 按下ok ok

完成。

2

有同样的问题,我编译项目使用Ant控制台。我已经将kotlin-stdlib.jar编译成类路径并且问题已经消失。