{
"llm" : {
"feedback" : "# Exercise: textanalysis\n\n### Correctness\n- `topWord()` wirft bei leerem Zähler (`mostCommonWord == null`) eine `IllegalStateException`; die Aufgabenstellung verlangt aber einfach, das häufigste Wort zurückzugeben (und macht keine Vorgabe, dass bei „noch keine Wörter“ eine Exception geworfen werden soll). Das kann dazu führen, dass das Testprogramm bei bestimmten Eingaben unerwartet abstürzt.\n\n### Suggestion\n- Überlege dir, was `topWord()` sinnvollerweise liefern soll, wenn noch kein Wort via `add(...)` hinzugefügt wurde (z.B. ein leerer String oder etwas anderes), und passe das Verhalten so an, dass der Aufrufer nicht zwingend eine Exception behandeln muss.\n\n### Code Style\n- In `add(...)` machst du für denselben Key mehrere Map-Zugriffe (`containsKey`, dann `put`, dann nochmal `get`); das lässt sich in der Regel mit weniger Zugriffen ausdrücken (und macht den Code kompakter/lesbarer).\n- `TextAnalyzer.main()` ist deutlich anders als im Template (kein `String[] args`, fester Dateipfad); auch wenn du es kommentierst: für die Abgabe/Autotests ist es besser, die vorgegebene Signatur und das Laden via Resources beizubehalten.\n\n\n# Exercise: lotto\n\n### Correctness\n- `BASE_PRIZE` und `MULTIPLIER` sind bei dir keine `static final` Konstanten mehr (sondern Instanzfelder). Das widerspricht der vorgegebenen API (`Lottery.BASE_PRIZE` / `Lottery.MULTIPLIER`) und kann dazu führen, dass Tests/anderer Code nicht kompiliert.\n- In `Ticket` rufst du `lottery.ifBeforeDrawException()` auf, aber diese Methode ist in `Lottery` package-private und nicht Teil der geforderten öffentlichen Schnittstelle; Tests erwarten typischerweise, dass `Ticket` den Zustand über öffentliche Methoden (z. B. indirekt über `getWinningNumbers()`) prüft, nicht über interne Helper der `Lottery`.\n- In `draw()` verwendest du `random.nextInt(1, maxNumber + 1)`: Diese Overload gibt es erst in neueren Java-Versionen. Falls die Übungsumgebung/Tests mit einer älteren Java-Version laufen, kompiliert das nicht.\n\n### Suggestion\n- Schau dir an, wie die Konstanten in der Vorlage deklariert waren und wie sie in der Beispielverwendung referenziert werden (Klassenname statt Objekt). Überlege, welche Modifier dafür nötig sind.\n- Überlege, wie `Ticket` selbst feststellen kann, ob schon gezogen wurde, ohne auf interne Methoden der `Lottery` zuzugreifen. Ein Hinweis steht in der Aufgabenbeschreibung: das `Ticket` soll die Gewinnzahlen über die Lotterie abfragen.\n- Prüfe, welche Java-Version im Kurs vorausgesetzt ist. Wenn unklar: nutze die `Random`-Variante, die garantiert in der Basisversion vorhanden ist, und passe die Bounds entsprechend an.\n\n### Code Style\n- Die Helper-Namen `ifAfterDrawException` / `ifBeforeDrawException` sind etwas missverständlich (sie “werfen ggf. eine Exception”, nicht “sind eine Exception”). Klarere Namen würden die Lesbarkeit verbessern.\n- `Ticket.getCorrectNumbers()` ruft erst `lottery.ifBeforeDrawException()` und danach `lottery.getWinningNumbers()` (was denselben Zustand ohnehin prüft). Das ist doppelt und macht den Code unnötig komplex.\n- Die Konstanten sollten als echte Konstanten (und damit unveränderlich und klassenweit) modelliert sein; aktuell suggeriert die Implementierung, dass sie pro `Lottery`-Objekt variieren könnten.\n",
"status" : "SUCCESS"
},
"unitTest" : {
"tests" : [ {
"name" : "buyTicketIds()",
"status" : "PASSED",
"message" : null
}, {
"name" : "buyTicketsIllegalNumbers()",
"status" : "PASSED",
"message" : null
}, {
"name" : "draw()",
"status" : "PASSED",
"message" : null
}, {
"name" : "drawNoDuplicates()",
"status" : "PASSED",
"message" : null
}, {
"name" : "drawRandom()",
"status" : "PASSED",
"message" : null
}, {
"name" : "drawAlreadyDrawn()",
"status" : "PASSED",
"message" : null
}, {
"name" : "getWinningNumbersNotDrawnYet()",
"status" : "PASSED",
"message" : null
}, {
"name" : "buyTicketAlreadyDrawn()",
"status" : "PASSED",
"message" : null
} ]
}
}