Erro em tempo de execução(na lógica do programa)

Sou novato na programação e gostaria de ajuda de vocês. Estou “desenvolvendo” um exemplo de um livro usado para explicar a serialização de objetos onde tenho um programa de flashCards que tem três classes: QuizCard, QuizCardBuilder e QuizCardPlayer.
QuizCard é uma classe auxiliar às outras. QuizCardBuilder é uma classe de construção dos flashCards e que os salva em um arquivo para que QuizCardPlayer os selecione e use.
Eis os Códigos :

import java.io.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import java.awt.event.*;

public class QuizCardPlayer {
	private JTextArea display;
	private JTextArea answer;
	private ArrayList<QuizCard> cardList;
	private QuizCard currentCard;
	private int currentCardIndex;
	private JFrame frame;
	private JButton nextButton;
	private boolean isShowAnswer;
	
	public static void main(String[] args){
		QuizCardPlayer player = new QuizCardPlayer();
		player.go();
	}
	public void go(){
		frame = new JFrame("QuizCard Player");
		JPanel mainPanel = new JPanel();
		Font bigFont = new Font("sanserif", Font.BOLD, 24);
		
		display = new JTextArea();
		display.setFont(bigFont);
		display.setLineWrap(true);
		display.setEditable(false);
		
		JScrollPane qScroller = new JScrollPane(display);
		qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		
		nextButton = new JButton("Show question");
		nextButton.addActionListener(new NextCardListener());
		mainPanel.add(qScroller);
		mainPanel.add(nextButton);
		mainPanel.setLayout( new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
		
		JMenuBar menuBar = new JMenuBar();
		JMenu fileMenu = new JMenu("file");
		JMenuItem loadMenuItem = new JMenuItem("load card set");
		loadMenuItem.addActionListener(new OpenMenuListener());
		menuBar.add(fileMenu);
		fileMenu.add(loadMenuItem);
		frame.setJMenuBar(menuBar);
		frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
		frame.setVisible(true);
		frame.setSize(640, 500);
	}
	public class NextCardListener implements ActionListener{
		public void actionPerformed(ActionEvent arg0) {
			if(isShowAnswer){
				display.setText(currentCard.getAnswer());
				nextButton.setText("Next Card");
				isShowAnswer = false;
			} else {
				if(currentCardIndex < cardList.size()){
					showNextCard();
				} else {
					display.setText("That was last card!");
					nextButton.setEnabled(false);
				}
			}
		}
	}
	public class OpenMenuListener implements ActionListener{
		public void actionPerformed(ActionEvent arg0){
			JFileChooser fileOpen = new JFileChooser();
			fileOpen.showOpenDialog(frame);
			loadFile(fileOpen.getSelectedFile());
		}
	}
	private void loadFile(File file){
		cardList = new ArrayList<QuizCard> ();
		try{
			BufferedReader reader = new BufferedReader(new FileReader(file));
			String line = null;
			while((line = reader.readLine()) != null){
				makeCard(line);
			}
			reader.close();
		} catch (Exception e) {
			System.out.println("Couldn't read the card file");
			e.printStackTrace();
		}
		showNextCard();
	}
	private void makeCard(String lineToParse){
		String[] result = lineToParse.split("/");
		QuizCard card = new QuizCard(result[0], result[1]);
		cardList.add(card);
		System.out.println("Made a card.");
	}
	private void showNextCard(){
		currentCard = cardList.get(currentCardIndex);
		currentCardIndex++;
		display.setText(currentCard.getQuestion());
		nextButton.setText("Show Answer");
		isShowAnswer = true;
	}
}

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.ScrollPaneConstants;

public class QuizCardBuilder {
	private JTextArea question;
	private JTextArea answer;
	private ArrayList<QuizCard> cardList;
	private JFrame frame;
	
	public static void main(String[] args){
		QuizCardBuilder builder = new QuizCardBuilder();
		builder.go();
	}
	public void go(){
		frame = new JFrame("QuizCard Buider");
		JPanel mainPanel = new JPanel();
		Font bigFont = new Font("sanserif", Font.BOLD, 24);
		question = new JTextArea(6, 20);
		question.setLineWrap(true);
		question.setWrapStyleWord(true);
		question.setFont(bigFont);
		
		JScrollPane qScroller = new JScrollPane(question);
		qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		
		answer = new JTextArea(6, 20);
		answer.setLineWrap(true);
		answer.setWrapStyleWord(true);
		answer.setFont(bigFont);
		
		JScrollPane aScroller = new JScrollPane(answer);
		aScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
		aScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
		
		JButton nextButton = new JButton("Next Card");
		
		cardList = new ArrayList<QuizCard>();
		
		JLabel qLabel = new JLabel("Question:");
		JLabel aLabel = new JLabel("Answer:");
		
		mainPanel = new JPanel();
		mainPanel.add(qLabel);
		mainPanel.add(qScroller);
		mainPanel.add(aLabel);
		mainPanel.add(aScroller);
		mainPanel.add(nextButton);
		mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS));
		nextButton.addActionListener(new NextCardListener());
		JMenuBar menuBar = new JMenuBar();
		JMenu fileMenu = new JMenu("File");
		JMenuItem newMenuItem = new JMenuItem("New");
		JMenuItem saveMenuItem = new JMenuItem("Save");
		newMenuItem.addActionListener(new NewMenuListener());
		saveMenuItem.addActionListener(new SaveMenuListener());
		
		fileMenu.add(newMenuItem);
		fileMenu.add(saveMenuItem);
		menuBar.add(fileMenu);
		frame.setJMenuBar(menuBar);
		frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
		frame.setVisible(true);
		frame.setSize(500,600);
	}
	public class NextCardListener implements ActionListener{
		public void actionPerformed(ActionEvent arg0) {
			QuizCard card = new QuizCard(question.getText(), answer.getText());
			cardList.add(card);
			clearCard();
		}
	}
	public class SaveMenuListener implements ActionListener{
		public void actionPerformed(ActionEvent ev) {
			QuizCard card = new QuizCard(question.getText(), answer.getText());
			cardList.add(card);
			
			JFileChooser fileSave = new JFileChooser();
			fileSave.showSaveDialog(frame);
			saveFile(fileSave.getSelectedFile());
		}
	}
	public class NewMenuListener implements ActionListener{
		public void actionPerformed(ActionEvent e) {
			cardList.clear();
			clearCard();
		}
	}
	private void clearCard(){
		question.setText("");
		answer.setText("");
		question.requestFocus();
	}
	private void saveFile(File file){
		try{
			BufferedWriter writer = new BufferedWriter(new FileWriter(file));
			for(QuizCard card : cardList){
				writer.write(card.getQuestion() + "/");
				writer.write(card.getAnswer() + "\n");
			}
			writer.close();
		} catch (Exception e){
			System.out.println("Couldn't write the cardList out");
			e.printStackTrace();
		}
	}
}

public class QuizCard {
	private String question;
	private String answer;
	
	public QuizCard(String q, String a){
		
	}
	public void setQuestion(String q){
		question = q;
	}
	public void setAnswer(String a){
		answer = a;
	}
	public String getQuestion(){
		return question;
	}
	public String getAnswer(){
		return answer;
	}
}

O problema reside na desserialização, onde não consigo vizualizar os flashCards salvos e construídos com QuizCardBuilder!

OBS: Esse código está contido em um livro(Use a cabeça Java), então quem já leu ou passou por isso e conseguiu fazer, por favor, me ajude!
Grato.

na classe QuizCardPlayer

esta dando erro porque cardList esta nulla no momento que vc clica no botão

public class NextCardListener implements ActionListener{  
        public void actionPerformed(ActionEvent arg0) {  
            if(isShowAnswer){  
                display.setText(currentCard.getAnswer());  
                nextButton.setText("Next Card");  
                isShowAnswer = false;  
            } else {  
                if(currentCardIndex < cardList.size()){  //esta null aqui
                    showNextCard();  
                } else {  
                    display.setText("That was last card!");  
                    nextButton.setEnabled(false);  
                }  
            }  
        }  
    }  

outro erro é quando vc clica no opçao de carregar arquivo e cancela, ele continua o processo como se um arquivo tivesse sido seleciona mas está nulla tambem é preciso tratar essas situações


 private void loadFile(File file){  // file está nullo quando ao tentar carregar vc clica em cancelar
        cardList = new ArrayList<QuizCard> ();  
        try{  
            BufferedReader reader = new BufferedReader(new FileReader(file));  
            String line = null;  
            while((line = reader.readLine()) != null){  
                makeCard(line);  
            }  
            reader.close();  
        } catch (Exception e) {  
            System.out.println("Couldn't read the card file");  
            e.printStackTrace();  
        }  
        showNextCard();  
    }  

outro problema, no seu QuizCardBuilder
quando vc clica em salvar o ele chama a Classe SaveMenuListener e executa o metodo actionPerformed

nesse metodo vc instancia a classe QuizCard passando dois parametros no construtor, mas o construtor da classe não faz nada com os parametros e por isso é salvo null/null no arquivo


public class SaveMenuListener implements ActionListener{  
        public void actionPerformed(ActionEvent ev) {  
            QuizCard card = new QuizCard(question.getText(), answer.getText());  //chama o construtor passando dois parametros
            cardList.add(card);  
              
            JFileChooser fileSave = new JFileChooser();  
            fileSave.showSaveDialog(frame);  
            saveFile(fileSave.getSelectedFile());  
        }  
    }  


public class QuizCard {  
    private String question;  
    private String answer;  
      
    public QuizCard(String q, String a){  
          // não faz nada com o parametros! não deveria atribuir a seus atributos "answer"  e "question"
    }  
    public void setQuestion(String q){  
        question = q;  
    }  
    public void setAnswer(String a){  
        answer = a;  
    }  
    public String getQuestion(){  
        return question;  
    }  
    public String getAnswer(){  
        return answer;  
    }  
}  

na classe QuizCardBuilder tem o mesmo problema da classe QuizCardPlay quando vc clica em cancelar na hora de salvar o arquivo

private void saveFile(File file){  // file nullo quando se clica no cancelar
        try{  
            BufferedWriter writer = new BufferedWriter(new FileWriter(file));  
            for(QuizCard card : cardList){  
                writer.write(card.getQuestion() + "/");  
                writer.write(card.getAnswer() + "\n");  
            }  
            writer.close();  
        } catch (Exception e){  
            System.out.println("Couldn't write the cardList out");  
            e.printStackTrace();  
        }  
    }  

Muito obrigado pela atenção, DaniloAndrade!
Ajudou bastante.