Ich arbeite an einem Java-Projekt und innerhalb dieses Projekts habe ich meinen ersten Versuch mit Kotlin unternommen. Ich habe damit begonnen, einige Klassen mit dem JavaToKoltin-Konverter, der in der Intellij-Idee enthalten ist, in Kotlin zu konvertieren. Unter anderem werden meine benutzerdefinierten Ausnahmen jetzt in Kotlin konvertiert. Damit funktioniert aber die Ausnahmebehandlung nicht mehr richtig.
Wenn ich eine meiner benutzerdefinierten Ausnahmen auslöse (z MyCustomKotlinException.kt) innerhalb des Java-Codes wird die Ausnahme nicht abgefangen (siehe Code unten).
// 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 ...
}
}
}
Kann mir also jemand erklären, warum die Ausnahme nicht gefangen wird. MyCustomKotlinException erbt von Kotlins RuntimeExceptionwas nur ein Alias für ist java.lang.RuntimeException.
// MyCustomKotlinException.kt
package foo
class MyCustomKotlinException(err: String) : RuntimeException(err)
Aktualisieren:
Ich habe den Throw-Teil in 2 Zeilen aufgeteilt (Instanzerstellung und Throwing) und festgestellt, dass das Problem nicht das Throwing ist. Der try-Block wird nach der Instanzerstellung verlassen. Stimmt etwas mit meiner Instanzerstellung dieser Kotlin-Klasse nicht?
Update2:
Ich habe einen zweiten catch-Block mit hinzugefügt Throwable und das folgende Throwable wird gefangen.
Der Titel wurde geändert, um den Fehler zu korrigieren, und das Problem beim Hinzufügen aller Projektdateien zur JAR-Datei behoben (siehe Antwort unten). Das Hinzufügen der Kotlin-Laufzeitbibliothek zu Gradle funktioniert bei mir nicht.
Bitte geben Sie ein vollständiges, reproduzierbares Minimalbeispiel an, beispielsweise mit diesem Kotlin-Quellcode.
– Geisterkatze
26. Mai 2017 um 8:59 Uhr
@GhostCat reicht dir das?
– FreshD
26. Mai 2017 um 9:13 Uhr
Es muss ausreichen, damit die Leute das Problem reproduzieren können. Sieht aus wie jetzt.
– Geisterkatze
26. Mai 2017 um 9:14 Uhr
@FreshD Ich kann das Problem mit dem von Ihnen bereitgestellten Code nicht reproduzieren.
– Christian Brüggemann
26. Mai 2017 um 11:50 Uhr
@Christian Ja, du hast recht. Ich habe es gerade mit diesem Beispiel versucht und es funktioniert. Aber die Ausnahmeklasse sieht gleich aus, aber mit einem anderen Namen, und auch die Instanzerstellung im try catch ist gleich, also keine Ahnung, warum es nur für das Beispiel funktioniert.
– FreshD
26. Mai 2017 um 12:01 Uhr
FreshD
Das Hinzufügen aller Projektdateien zum JAR hat das Problem für mich behoben. Ich habe die folgende Zeile zu meiner hinzugefügt 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) } }
}
Aktualisieren: Geändert configurations.compile.collect zu configurations.compileClasspath.collect gemäß dieser Antwort unten.
Verwenden configurations.compileClasspath jetzt statt configurations.compile wie @simon-o oben erwähnt.
– Chris
16. Februar 2020 um 19:27 Uhr
Könnten Sie mir bitte Schritt für Schritt erklären, wie Sie die JAR-Datei Ihres Projekts generiert haben? Damit habe ich große Probleme
– Bruno Azevedo
12. September 2020 um 1:14 Uhr
wie mache ich das weiter build.gradle.kts?
– ausbessern3
15. Februar 2021 um 6:45 Uhr
@mending3 Was passiert, wenn Sie die obigen Zeilen hinzufügen build.gradle.kts?
– FreshD
15. Februar 2021 um 11:23 Uhr
Suraj Vaishnav
Sie müssen Ihr Projekt mit Kotlin konfigurieren. Also im Android Studio:
Klicken Sie auf Tools => kotlin => Kotlin im Projekt konfigurieren
Überprüfen Sie dann im Dialog: Alle Module, die Kotlin-Dateien enthalten
und Version auswählen
drücke OK
Fertig.
Dieser Fehler ist wahrscheinlich darauf zurückzuführen, dass die einfache JAR-Aufgabe nicht alle ihre Laufzeitabhängigkeiten übernimmt.
Aus Gradle DokumentationIn deiner build.gradle.kts Sie können entweder eine “fatJar”-Aufgabe erstellen oder diese zu Ihrer JAR-Aufgabe hinzufügen:
tasks.withType<Jar> {
// Otherwise you'll get a "No main manifest attribute" error
manifest {
attributes["Main-Class"] = "com.example.MainKt"
}
// To add all of the dependencies
from(sourceSets.main.get().output)
dependsOn(configurations.runtimeClasspath)
from({
configurations.runtimeClasspath.get().filter { it.name.endsWith("jar") }.map { zipTree(it) }
})
}
Danke, als ich auf die Ausnahme von 【ist ein Duplikat, aber es wurde keine Duplikatbehandlungsstrategie festgelegt】 gestoßen bin, habe ich 【duplicatesStrategy = DuplicatesStrategy.EXCLUDE】 hinzugefügt und es war in Ordnung
– Lancer.Yan
15. Juni um 4:43
Ich werde sagen, dass Sie versuchen, Kotlin-Code ohne das auszuführen kotlin-runtime Bibliothek
Überprüfen Sie, welches System Sie verwenden, und fügen Sie die erforderliche JAR-Datei hinzu. Sie können überprüfen, ob dies Ihr Problem ist, indem Sie Ihr Projekt in a verpacken .jar Datei und Ausführen mit der Laufzeitbibliothek
Simon o
Danke für den Kommentar. In der Tat compile ist veraltet. Die akzeptierte Antwort funktioniert jedoch nicht mit implementation. Also habe ich nachgeschaut Konfiguration des Java-Bibliotheks-Plugins und implementation hängt von compileClasspath ab.
Also ist meine Lösung für jetzt, hinzuzufügen
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) } }
}
Ich bin der Meinung, dass dies vom Plugin org.jetbrains.kotlin.jvm erledigt werden sollte.
Verwenden compile Anstatt von implementation in den Abhängigkeiten der build.gradle-Datei hat es für mich gelöst.
implementation ist neuer als compile. Sollte nicht als Ersatz verwendet werden
– Kishita Variya
30. Oktober 2019 um 11:48 Uhr
@Kishita Danke für deinen Kommentar. Sie haben absolut Recht und compilieren sollte nicht mehr verwendet werden. Ich habe nach einer besseren Alternative gesucht und meine Antwort aktualisiert.
– Simon O
31. Oktober 2019 um 15:35 Uhr
Oh, und übrigens, der Grund, warum Sie configurations.implementation.collect oder configurations.api.collect nicht verwenden können, ist, dass sie nicht aufgelöst werden können.
– Simon O
31. Oktober 2019 um 15:37 Uhr
Dmitri Kanunnikoff
Hatte das gleiche Problem beim Kompilieren meines Projekts mit Ant in der Konsole. Ich habe kotlin-stdlib.jar in den Klassenpfad eingefügt und das Problem ist verschwunden.
implementation ist neuer als compile. Sollte nicht als Ersatz verwendet werden
– Kishita Variya
30. Oktober 2019 um 11:48 Uhr
@Kishita Danke für deinen Kommentar. Sie haben absolut Recht und compilieren sollte nicht mehr verwendet werden. Ich habe nach einer besseren Alternative gesucht und meine Antwort aktualisiert.
– Simon O
31. Oktober 2019 um 15:35 Uhr
Oh, und übrigens, der Grund, warum Sie configurations.implementation.collect oder configurations.api.collect nicht verwenden können, ist, dass sie nicht aufgelöst werden können.
– Simon O
31. Oktober 2019 um 15:37 Uhr
Eng.Fouad
Das Hinzufügen des Folgenden löste das Problem für mich:
Bitte geben Sie ein vollständiges, reproduzierbares Minimalbeispiel an, beispielsweise mit diesem Kotlin-Quellcode.
– Geisterkatze
26. Mai 2017 um 8:59 Uhr
@GhostCat reicht dir das?
– FreshD
26. Mai 2017 um 9:13 Uhr
Es muss ausreichen, damit die Leute das Problem reproduzieren können. Sieht aus wie jetzt.
– Geisterkatze
26. Mai 2017 um 9:14 Uhr
@FreshD Ich kann das Problem mit dem von Ihnen bereitgestellten Code nicht reproduzieren.
– Christian Brüggemann
26. Mai 2017 um 11:50 Uhr
@Christian Ja, du hast recht. Ich habe es gerade mit diesem Beispiel versucht und es funktioniert. Aber die Ausnahmeklasse sieht gleich aus, aber mit einem anderen Namen, und auch die Instanzerstellung im try catch ist gleich, also keine Ahnung, warum es nur für das Beispiel funktioniert.
– FreshD
26. Mai 2017 um 12:01 Uhr