Kopiowanie listy aby zmienić element klasy za pomocą metody.

0

Hej, mam pewien problem, prawdopodobnie wiążący się z faktem mojej niewiedzy, jak to się konkretnie robi w Javie. Albo zawierający jakiś głupi błąd innej natury.

Wyrzuca mi wiecznie java.lang.NullPointerException przy próbie przekazania w metodzie listy, bądź w miejscu w którym próbuję się do niej odwołać.
Stworzyłem takie klasy:
ClassQuizCreator
ClassQuiz
ClassQuestion

ClassQuizCreator to ogólnie GUI (trochę za długie by tu przeklejać, więc skupię się na fragmentach.
deklaruje takie zmienne:

    private static ClassQuiz quiz;
    private static ClassQuestion question;

W trakcie inicjalizacji GUI, przypisuję je:

            quiz = new ClassQuiz();
            question = quiz.get_current_question();

Metoda get_current_question w klasie ClassQuiz, zwraca nam pierwszy obiekt tablicy o typie ClassQuestion:

    private ClassQuestion[] questions = new ClassQuestion[NUM_OF_QUESTION_CAP_VALUE];
    public ClassQuestion get_current_question(){
        try {
            return questions[indexQuestion];
        } catch (NullPointerException ex) {
            numberOfQuestions++;
            questions[indexQuestion] = new ClassQuestion();
            return questions[indexQuestion];
        }
    }

indexQuestion początkowo jest ustawiony na 0.
I gdy próbuję w ClassQuestionCreator z poprawnymi argumentami wywołać metodę:

    public void createQuestion(String image, String question, String[] answers, int[] points, short questiontype) {
        loadedImageName = image;
        questionContent = question;
        answersContent = answers;
        pointedAnswers = points;
        questionType = questiontype;
    }

Wyskakuje mi niestety błąd o którym wspomniałem java.lang.NullPointerException. Jestem pewien że niestety w wywołaniu metody pojawia się ten błąd, sprawdziłem jak barbarzyńca do którego momentu pojawiają się printy.

Jeśli ktoś zechciałby pomóc ale potrzebowałby abym dosłał coś jeszcze, to chętnie wyślę :).

0

Gdzie jest ten indexQuestion ustawiony na zero? Jesteś pewien, że to ta metoda rzuca wyjątek, a co z innymi "poprawnymi" argumentami?

0

sprawdziłem jak barbarzyńca do którego momentu pojawiają się printy

może dla odmiany użyj debuggera jak cywilizowany programista? :)

Jak masz możliwość udostępnienia całości to chętnie się przyjrzę bardziej.

0
mdolata napisał(a):

sprawdziłem jak barbarzyńca do którego momentu pojawiają się printy

może dla odmiany użyj debuggera jak cywilizowany programista? :)

Jak masz możliwość udostępnienia całości to chętnie się przyjrzę bardziej.

Pewnie, to tylko jeden z pięciu projektów w NetBeans na studia :).
Dorzucam w załączniku projekt spakowany do .7z
Pliki można znaleźć w: ApplicationQuiz > src > pliki

1

Niezły bałagan masz w kodzie :)

Zacznę od tego że metoda getFields zwróci rzuci komunikatem o błędzie ale zwróci true, niby że poprawne dane :) jest więcej przypadków że ta walidacja nie działa.

Co do NullPointerExceptiona z pytania:

Masz taki kod przy przechodzeniu do następnego pytania:

private boolean buildQuestion() {
        if (checkFields()) {
            question = quiz.get_current_question();
            if (question.isCreated()) {
                System.out.println("Stworzone!");
            } else {
                System.out.println("Puste!");
            }
...
}

flow które przetestowałem sprawdza poprawność pól, pobiera pytanie z obiektu quiz ale zwracany jest null i póżniej w ifie wywoływana jest metoda isCreated i tu leci NullPointerException.

Powód?
Metoda

    public ClassQuestion get_current_question() {
        try {
            return questions[indexQuestion];
        } catch (NullPointerException ex) {
            numberOfQuestions++;
            questions[indexQuestion] = new ClassQuestion();
            return questions[indexQuestion];
        }
    }

zawsze zwraca nulla, nie jest tutaj rzucany wyjątek, więc nie jest tworzony obiekt klasy ClassQuestion.

0

Dzięki :D!

Jeszcze miałbym jedno pytanie.
W takim razie istnieje sposób by sprawdzić w javie czy pod danym indeksem istnieje element?
Bo jedyne co znajduje w sieci to sposoby dla ArrayList.
Chodzi mi o to żeby go zwrócić jeśli istnieje, a jeśli nie, to stworzyć i zwrócić.

Nie będę czarował, w Javie się czuje jak mucha w smole, o ile sobie z reguły radzę, to czasem mnie toporność języka przy prostych rzeczach przerasta.

1

Generalnie bym mocno to przebudował, ale to o co pytasz to można zrobić przez sprawdzenie czy pod danym indexem jest obiekt:

    public ClassQuestion get_current_question() {
        if (questions[indexQuestion] != null)
            return questions[indexQuestion];

            //numberOfQuestions++; current a nie nastepne IMO
            questions[indexQuestion] = new ClassQuestion();
            return questions[indexQuestion];
    }

Patrzyłem przez chwilę głębiej w kod i mam parę uwag:

  • public void createQuestion(String image, String question, String[] answers, int[] points, short questiontype, int arrSize) nie musisz podawać rozmiaru tablicy. W javie ten typ ma pole length.
  • private short indexQuestion = 0; jak inicjujesz zmienna w konstruktorze to nie musisz tego robić przy deklaracji.
  • rozważ użycie Enuma przy polach typu questionType

1 użytkowników online, w tym zalogowanych: 0, gości: 1