AutoFeedback API

Result 8a145451-ef84-4556-8e2f-fc7e053d8bc0

{
  "llm" : {
    "feedback" : "# Exercise: textanalysis\n\n### Correctness\n- In `add(String word)` setzt du bei einem neuen Wort den Zähler auf `0`; damit wird das erste Vorkommen nicht mitgezählt (korrekt wäre, dass ein Wort nach dem ersten `add` eine Häufigkeit von 1 hat).\n\n### Suggestion\n- Überlege dir, was die Zahl in deiner Map genau bedeutet: „Anzahl Vorkommen bisher“. Wenn ein Wort zum ersten Mal auftaucht, welchen Wert muss es dann bekommen, damit `topWord()` später wirklich das häufigste Wort findet?\n\n### Code Style\n- Das Feld `wordList` sollte `private` sein, damit die interne Datenstruktur nicht von außen verändert werden kann.\n- Java-Konventionen: Variablennamen beginnen i.d.R. klein (z.B. `topWord` statt `TopWord`), und bei `if` ist ein Leerzeichen üblich (`if (wordList.containsKey(word))`).\n\n\n# Exercise: lotto\n\n### Correctness\n- In `Lottery.draw()` initialisierst du `winningNumbers` nie (steht zu Beginn auf `null`), rufst aber `winningNumbers.size()` und `winningNumbers.add(...)` auf → das führt zu einer `NullPointerException` statt 6 Zahlen zu ziehen.\n- In `Lottery.draw()` verwendest du `generator.nextInt(1, maxNumber)`: damit ist `maxNumber` **exklusiv**, d. h. die höchste Zahl kann nie gezogen werden (bei 42 wird 42 nie vorkommen) → Anforderung „zwischen 1 und Höchstzahl“ wird verletzt.\n- `Ticket` ist noch nicht implementiert: Konstruktor speichert die Zahlen nicht, und `getNumbers()`, `getCorrectNumbers()` und `getPrize()` geben aktuell `null`/`0` zurück → damit kann die App/Tests die korrekten Zahlen und Gewinne nicht berechnen.\n\n### Suggestion\n- Schau dir an, wann `winningNumbers` zum ersten Mal einen echten `HashSet`-Wert bekommen muss, damit `size()`/`add()` funktionieren; das sollte beim Start der Ziehung passieren.\n- Prüfe bei `Random.nextInt(origin, bound)` genau, ob `bound` inklusiv oder exklusiv ist, und wie du sicherstellst, dass die Obergrenze wirklich erreichbar ist.\n- Für `Ticket`: Lege eine Instanzvariable für die 6 Tippzahlen an (z. B. Collection aus dem JCF), fülle sie im Konstruktor, und gib in `getNumbers()` eine Kopie zurück.\n- Für `getCorrectNumbers()`: Überlege dir, wie du die Schnittmenge zwischen Tippzahlen und `lottery.getWinningNumbers()` ermittelst, ohne interne Datenstrukturen der Lottery zu verändern.\n- Für `getPrize()`: Rechne zuerst aus, wie viele Treffer vorliegen, und bilde daraus den Gewinn gemäß „0→0, 1→5, jede weitere *20“.\n\n### Code Style\n- Unnötige Imports in `Lottery.java`: `java.util.random.RandomGenerator` wird nicht verwendet (und auch `HashSet`/`Random` reichen).\n- In `buyTicket()` ist `nextNumberCounter` redundant: du kannst die Validierung „6 gültige, verschiedene Zahlen“ auch ohne separaten Zähler ausdrücken (weniger Variablen, klarere Logik).\n- In `draw()` steht noch ein `// TODO` obwohl schon Code vorhanden ist – entweder entfernen oder TODO konkretisieren.\n",
    "status" : "SUCCESS"
  },
  "unitTest" : {
    "tests" : [ {
      "name" : "buyTicketIds()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "buyTicketsIllegalNumbers()",
      "status" : "PASSED",
      "message" : null
    }, {
      "name" : "draw()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "drawNoDuplicates()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "drawRandom()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "drawAlreadyDrawn()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "getWinningNumbersNotDrawnYet()",
      "status" : "FAILED",
      "message" : null
    }, {
      "name" : "buyTicketAlreadyDrawn()",
      "status" : "FAILED",
      "message" : null
    } ]
  }
}