Fix: NullPointerException in conlluOutput

Change-Id: I4f739a462b7dd6a719e8b193ecc0e320e18a9d6a
diff --git a/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt b/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt
index 15a654a..97dcebb 100644
--- a/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt
+++ b/app/src/main/kotlin/de/ids_mannheim/korapxmltools/KorapXmlTool.kt
@@ -1260,7 +1260,7 @@
             }
 
             if (morpho[docId]?.containsKey("${span.from}-${span.to}") == true) {
-                val mfs = morpho[docId]!!["${span.from}-${span.to}"]
+                val mfs = morpho[docId]?.get("${span.from}-${span.to}")
                 if (mfs != null) {
                     // Add offset info to MISC field for external annotation with ZIP output
                     val miscWithOffset = if (annotationWorkerPool != null && outputFormat == OutputFormat.KORAPXML) {
@@ -1269,21 +1269,34 @@
                         else "${existing}|Offset=${span.from}-${span.to}"
                     } else mfs.misc ?: "_"
 
-                    output.append(
-                        printConlluToken(
-                            token_index,
-                            tokenText,
-                            mfs.lemma ?: "_",
-                            mfs.upos ?: "_",
-                            mfs.xpos ?: "_",
-                            mfs.feats ?: "_",
-                            mfs.head ?: "_",
-                            mfs.deprel ?: "_",
-                            mfs.deps ?: "_",
-                            miscWithOffset,
-                            columns
+                    try {
+                        output.append(
+                            printConlluToken(
+                                token_index,
+                                tokenText,
+                                mfs.lemma ?: "_",
+                                mfs.upos ?: "_",
+                                mfs.xpos ?: "_",
+                                mfs.feats ?: "_",
+                                mfs.head ?: "_",
+                                mfs.deprel ?: "_",
+                                mfs.deps ?: "_",
+                                miscWithOffset,
+                                columns
+                            )
                         )
-                    )
+                    } catch (e: NullPointerException) {
+                        LOGGER.warning("NPE processing morpho for $docId at ${span.from}-${span.to}: ${e.message}")
+                        // Fallback to token without morpho
+                        val miscWithOffset = if (annotationWorkerPool != null && outputFormat == OutputFormat.KORAPXML) {
+                            "Offset=${span.from}-${span.to}"
+                        } else "_"
+                        output.append(
+                            printConlluToken(
+                                token_index, tokenText, misc = miscWithOffset, columns = columns
+                            )
+                        )
+                    }
                 } else {
                     // Fallback if mfs is null
                     val miscWithOffset = if (annotationWorkerPool != null && outputFormat == OutputFormat.KORAPXML) {