Hallo liebe Community,
ich wollte zur Auffrischung meiner JAVA-Kenntnisse im grafischen Bereich einen kleinen Rechentrainer coden, der Aufgaben des kleinen 1*1 stellt, die der Nutzer dann beantworten kann. Außerdem sollen falsche Antworten in einer ArrayList abgespeichert werden, damit der Benutzer nach Beantwortung aller Aufgaben die falsch Gelösten noch einmal sieht. Beim Hinzufügen bekomme ich eine NullPointerException, kann mir diese jedoch nicht erklären.
Hier Teile meines Codes:
Um manche eventuell auftretende Fragen schon einmal im Voraus zu klären:
Die Klasse Aufgabe besteht aus einem ersten und zweiten Faktor, die als Integer gespeichert sind. AufgabenManager hingegen kümmert sich zunächst um die Erzeugung eines Aufgabenarrays, welches er hinterher zufällig durchmixt. Um die nächste Aufgabe zurückzugeben, hat er zudem eine currentExercise Variable, die mit jedem Zurückgeben einer Aufgabe um 1 hochgeht.
Es wäre super, wenn es jemand schafft, den entsprechenden Fehler im Code zu finden!
Vielen Dank schon einmal im Voraus,
euer Streeber

ich wollte zur Auffrischung meiner JAVA-Kenntnisse im grafischen Bereich einen kleinen Rechentrainer coden, der Aufgaben des kleinen 1*1 stellt, die der Nutzer dann beantworten kann. Außerdem sollen falsche Antworten in einer ArrayList abgespeichert werden, damit der Benutzer nach Beantwortung aller Aufgaben die falsch Gelösten noch einmal sieht. Beim Hinzufügen bekomme ich eine NullPointerException, kann mir diese jedoch nicht erklären.
Hier Teile meines Codes:
Java:
public class Rechentrainer extends JFrame {
//Attribute
private static final String AUTHOR = "JW";
private static final String VERSION = "1.2";
AufgabenManager aufgabenManager;
Aufgabe currentAufgabe;
StatistikManager statistikManager;
public ArrayList<Aufgabe> falschGeloesteAufgaben;
//Komponenten
private JPanel contentPane;
private JButton btnStart;
private JButton btnNaechsteAufgabe;
private JTextField tfErgebnis;
private JLabel lblNummer1;
private JLabel lblNummer2;
//Start des Programms
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Rechentrainer frame = new Rechentrainer();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
//Erzeugung Frame
public Rechentrainer() {
//Frame Einstellungen
setTitle(Rechentrainer.getMainTitle());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setResizable(false);
//Content Pane
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
initMenu();
initComponents();
aufgabenManager = new AufgabenManager();
}
private static String getMainTitle() {
String title = "Rechentrainer v. " + Rechentrainer.VERSION + " | " + Rechentrainer.AUTHOR;
return title;
}
private void initMenu() {
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
//1. Menü
JMenu menu1 = new JMenu("Menü");
menuBar.add(menu1);
JMenuItem miRundeStoppen = new JMenuItem("Aktuelle Runde Stoppen");
miRundeStoppen.addActionListener(e -> {stop();});
menu1.add(miRundeStoppen);
JMenuItem miBeenden = new JMenuItem("Beenden");
miBeenden.addActionListener(e -> {System.exit(0);});
menu1.add(miBeenden);
JMenuItem miInformationen = new JMenuItem("Informationen");
miInformationen.addActionListener(e -> {
JOptionPane.showMessageDialog(this, "Coded by: " + Rechentrainer.AUTHOR + "\n" + "Version: " + Rechentrainer.VERSION);
});
menu1.add(miInformationen);
}
private void initComponents() {
//Labels - statische
JLabel lblMultiplikator = new JLabel("x");
lblMultiplikator.setFont(new Font("Arial", Font.BOLD, 16));
lblMultiplikator.setBounds(79, 126, 28, 38);
contentPane.add(lblMultiplikator);
JLabel lblGleichzeichen = new JLabel("=");
lblGleichzeichen.setFont(new Font("Arial", Font.BOLD, 16));
lblGleichzeichen.setBounds(130, 126, 28, 38);
contentPane.add(lblGleichzeichen);
//Labels - Faktoren
lblNummer1 = new JLabel("13");
lblNummer1.setFont(new Font("Arial", Font.BOLD, 16));
lblNummer1.setBounds(42, 126, 36, 38);
contentPane.add(lblNummer1);
lblNummer2 = new JLabel("13");
lblNummer2.setFont(new Font("Arial", Font.BOLD, 16));
lblNummer2.setBounds(102, 126, 36, 38);
contentPane.add(lblNummer2);
//Ergebnisfeld
tfErgebnis = new JTextField();
tfErgebnis.setBounds(156, 130, 96, 32);
contentPane.add(tfErgebnis);
tfErgebnis.setColumns(10);
tfErgebnis.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
nextAufgabe();
}
}
});
tfErgebnis.setEditable(false);
//Buttons
btnStart = new JButton("Start");
btnStart.setBounds(42, 22, 384, 38);
btnStart.addActionListener(e -> {
start();
});
contentPane.add(btnStart);
btnNaechsteAufgabe = new JButton("Nächste Aufgabe");
btnNaechsteAufgabe.setEnabled(false);
btnNaechsteAufgabe.addActionListener(e -> {
nextAufgabe();
});
btnNaechsteAufgabe.setBounds(281, 128, 119, 38);
contentPane.add(btnNaechsteAufgabe);
}
private void start() {
aufgabenManager.neueRunde();
btnStart.setEnabled(false);
nextAufgabe();
//Komponenten sichtbar machen
tfErgebnis.setEditable(true);
btnNaechsteAufgabe.setEnabled(true);
}
private void stop() {
//Statistiken anzeigen
System.out.println("Falsche: " + statistikManager.getAnzahlFalsche());
System.out.println("Richtige: " + statistikManager.getAnzahlRichtige());
btnStart.setEnabled(true);
//Komponenten unsichtbar machen
tfErgebnis.setEditable(false);
btnNaechsteAufgabe.setEnabled(false);
}
private void nextAufgabe() {
if(!aufgabenManager.isRoundOver()) {
if(currentAufgabe != null)
alteAufgabePruefen();
currentAufgabe = aufgabenManager.getNextAufgabe();
lblNummer1.setText(String.valueOf(currentAufgabe.getFirstNumber()));
lblNummer2.setText(String.valueOf(currentAufgabe.getSecondNumber()));
tfErgebnis.requestFocus();
tfErgebnis.setText("");
} else {
stop();
}
}
private void alteAufgabePruefen() {
int korrektesErgebnis = currentAufgabe.getFirstNumber() * currentAufgabe.getSecondNumber();
int userErgebnis = Integer.parseInt(tfErgebnis.getText());
if( userErgebnis != korrektesErgebnis) {
falschGeloesteAufgaben.add(currentAufgabe);
}
}
}
Um manche eventuell auftretende Fragen schon einmal im Voraus zu klären:
Die Klasse Aufgabe besteht aus einem ersten und zweiten Faktor, die als Integer gespeichert sind. AufgabenManager hingegen kümmert sich zunächst um die Erzeugung eines Aufgabenarrays, welches er hinterher zufällig durchmixt. Um die nächste Aufgabe zurückzugeben, hat er zudem eine currentExercise Variable, die mit jedem Zurückgeben einer Aufgabe um 1 hochgeht.
Code:
public Aufgabe getNextAufgabe() {
currentAufgabe++;
return aufgaben[currentAufgabe-1];
}
Es wäre super, wenn es jemand schafft, den entsprechenden Fehler im Code zu finden!
Vielen Dank schon einmal im Voraus,
euer Streeber