2017-05-26 61 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編譯成類路徑並且問題已經消失。