Je travaille sur un projet Java et dans ce projet, j'ai fait mon premier essai avec Kotlin. J'ai commencé à convertir certaines classes en Kotlin avec le convertisseur JavaToKoltin fourni dans Intellij Idea. Entre autres, mes exceptions personnalisées sont maintenant converties en Kotlin. Mais avec cela, la gestion des exceptions ne fonctionne plus correctement.
Si je lance l'une de mes exceptions personnalisées (par exemple, MyCustomKotlinException.kt
) dans le code Java, l'exception n'est pas interceptée (voir le code ci-dessous).
// 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 ...
}
}
}
Alors, quelqu'un peut-il m'expliquer pourquoi l'exception n'est pas attrapée. MyCustomKotlinException
hérite de Kotlins RuntimeException
, qui est simplement un alias de Java.lang.RuntimeException
.
// MyCustomKotlinException.kt
package foo
class MyCustomKotlinException(err: String) : RuntimeException(err)
Mettre à jour:
J'ai divisé la partie de projection en 2 lignes (création et lancement d'instance) et constaté que le problème n'était pas le lancement. Le bloc try est laissé après la création de l'instance. Quelque chose ne va pas avec la création de mon instance de cette classe Kotlin?
Update2:
J'ai ajouté un second bloc catch avec Throwable
et le Throwable suivant est attrapé.
Java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics
...
Caused by: Java.lang.ClassNotFoundException: kotlin.jvm.internal.Intrinsics
Update3:
Modification du titre pour corriger l'erreur et résolution du problème lié à l'ajout de tous les fichiers du projet à jar (voir réponse ci-dessous) .
L'ajout de tous les fichiers de projet dans le fichier jar a résolu le problème pour moi. J'ai ajouté la ligne suivante à mon 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) } }
}
Vous devez configurer votre projet avec kotlin . Donc, dans Android Studio:
cliquer sur Outils => kotlin => Configurer kotlin dans le projet
Ensuite, dans la boîte de dialogue: tous les modules contenant des fichiers kotlin
et sélectionnez la version
appuyer sur OK
Terminé.
Je vais dire que vous essayez d'exécuter du code Kotlin sans la bibliothèque kotlin-runtime
Vérifiez le système que vous utilisez et ajoutez le fichier jar nécessaire. Vous pouvez vérifier qu'il s'agit bien de votre problème en compilant votre projet dans un fichier .jar
et en l'exécutant avec la bibliothèque runtime
Avait le même problème, compiler mon projet avec Ant dans la console. J'ai édité kotlin-stdlib.jar dans classpath et le problème est parti.
cela résoudra "Intrinsics" à Kotlin
ajoute ces bibliothèques dans un fichier gradle
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.2.41'
implementation 'nl.dionsegijn:konfetti:1.1.2'
Dans mon cas, une enableFeaturePreview
dans le fichier settings.gradle est à l'origine de ce problème lors de la migration vers Kotlin 1.3.