Input/Output Mehrzeiligen String aus Textdatei erstellen

DrPils

Bekanntes Mitglied
Moin,
Ich bastel gerade an einem Quiz. Die Fragen sollen aus einer Textdatei gelesen werden. Die Fragen sind dreizeilig: 1. Frage 2. Antwortmöglichkeiten 3. Richtige Antwort. Die Fragen werden durch leere Zeilen voneinander getrennt.
Ich dachte mir am besten löse ich das mit einer Schleife "Solange Zeile nicht leer ist, ergänze String question um Zeile".
Bei meinem Code bekomme ich aber eine Nullpointer Exception.
Der Pfad ist richtig gesetzt und ohne die Schleife wird die Datei auch gelesen.

Java:
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;

public class QuizMaster {

    private Path path;
    private int score;

    public QuizMaster(Path path) {
    this.path = path;
    }

    public String getNextQuestion() {
    String question = "";
    try (BufferedReader in = Files.newBufferedReader(path)) {
        while (!in.readLine().isBlank()) {
        question += in.readLine();
        }

    } catch (IOException e) {
        e.printStackTrace();
    }
    return question;
    }

}
 
Zuletzt bearbeitet:
Ich empfehle dir für deinen speziellen Fall eine Klasse "QuestionReader", welche das Interface Iterator<Question> implementiert, damit also die Methoden next() und hasNext(). Die Klasse Question benötigst du dafür natürlich auch. Hier ein Beispiel (bei mir ohne Leerzeilentrenner, müsstest du bei dir entsprechend anpassen; außerdem habe ich zu Demozwecken den StringReader statt FileReader eingesetzt):

Java:
public class Question {
    private String question;
    private String[] answers;
    private String correctAnswer;

    public Question(String question, String answers, String correctAnswer) throws IllegalArgumentException {
        if (question == null || answers == null || correctAnswer == null) {
            throw new IllegalArgumentException();
        }

        this.question = question;
        this.answers = answers.split(";");
        this.correctAnswer = correctAnswer;
    }

    @Override
    public String toString() {
        return "Question{" +
                "question='" + question + '\'' +
                ", answers=" + Arrays.toString(answers) +
                ", correctAnswer='" + correctAnswer + '\'' +
                '}';
    }
}

Java:
public class QuestionReader implements AutoCloseable, Iterator<Question> {
    private BufferedReader reader;
    private Question nextQuestion;

    public QuestionReader(String questions) {
        reader = new BufferedReader(new StringReader(questions));
        readNext();
    }

    private void readNext() {
        try {
            nextQuestion = new Question(reader.readLine(), reader.readLine(), reader.readLine());
        } catch(IOException | IllegalArgumentException e) {
            nextQuestion = null;
        }
    }

    @Override
    public Question next() {
        Question question = nextQuestion;
        readNext();
        return question;
    }

    @Override
    public boolean hasNext() {
        return nextQuestion != null;
    }

    @Override
    public void close() throws IOException{
        reader.close();
    }
}

Java:
public class QuestionDemo {
    private static final String example =
            "Hauptstadt Deutschlands?\n"
                    + "Berlin;München\n"
                    + "Berlin\n"
                    + "Epidemie 2020?\n"
                    + "Corinna;Corona\n"
                    + "Corona\n";

    public static void main(String... args) throws IOException {
        try (QuestionReader reader = new QuestionReader(example)) {
            while (reader.hasNext()) {
                System.out.println(reader.next());
            } // oder kurz: reader.forEachRemaining(System.out::println);
        }
    }
}

Question{question='Hauptstadt Deutschlands?', answers=[Berlin, München], correctAnswer='Berlin'}
Question{question='Epidemie 2020?', answers=[Corinna, Corona], correctAnswer='Corona'}
 
Zuletzt bearbeitet:

Zurück
Oben