Pracuję sobie nad aplikacją JFXS, która będzie pobierała z serwera xml i wstawiała zawarte w nim informacje do panelu. Napisałem sobie obiekt, który będzie odpowiadał za połączenie z serwerem. Generalnie ma on metodę call, która przyjmuje listę parametrów i ich wartości. Na ich podstawie tworzy url i wysyła żądanie. W trakcie pracy natknąłem się jednak na ciekawą właściwość JFXS. Otóż nie ma w nim NullPointerException!

I jak tu pracować?

Na początek przykładowy kod:

Listing 1. Kod z niezainicjowaną zmienną

/*
 * Main.fx
 */

package eu.runelord;

import javafx.scene.Scene;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import eu.runelord.communication.DataGetter;
import javafx.scene.input.MouseEvent;
import java.lang.System;

/**
 * @author koziolek
 */

var getter : DataGetter;
Stage {
    title: "Application title"
    width: 800
    height: 600
    scene: Scene {
        content: Text {
            font: Font {
                size: 24
            }
            x: 10,
            y: 30
            content: "Application content"
            onMouseClicked: function( e: MouseEvent ):Void {
                System.out.println("cliked");
                getter.call(["a"], ["a"]);
            }
        }
    }
}

Pomimo, że zmienna getter nie została zainicjowana nie otrzymamy żadnego wyjątku. Metoda call() nie zostanie wywołana.
Odpowiedź na zadane pytanie można zawrzeć w poniższej liście:

  • Pisać dokumentację, w której będzie podane co jest a co nie jest inicjowane
  • Inicjować zmienne i pola na wartościach domyślnych ręcznie
  • Tworzyć „czyste” pliki klas. Pliki takie powinny zawierać tylko kod klasy bez dodatkowych zmiennych poza blokiem class.

Deklaratywna składnia JFXS pozwala na dużą swobodę, a kompilator wybaczyć może wiele dziwnych konstrukcji. Nie zwalnia to nas jednak z odpowiedzialności za kod, który tworzymy.