Nein, da steht tGarage
?.cancel, nicht tGarage.cancel
Und null ist etwas anderes als 0 (und auch etwas anderes als NULL)
Aber der Reihe nach...
tGarage.cancel löscht den Timer aus dem Scheduler, auf den der Zeiger tGarage zeigt.
Wenn tGarage leer ist (also null), gibt es eine nullPointerException (der Pointer enthält den Wert null, deshalb tritt eine Ausnahme auf)
Um das zu vermeiden, prüft man vorher, ob tGarage ungleich null ist.
Das ? als Operator macht nichts anderes.
ist gleichbedeutend mit
0 ist eine Zahl
null bedeutet "leer"
NULL ist ebenfalls "leer", aber für den Status eines Items (was etwas völlig anderes ist als eine Variable oder Konstante)
Variablen und Konstanten sind stets Zeiger auf eine Speicherzelle (passend zum Datentyp). Wenn eine Zelle "leer" ist, so wird der Zeiger auf die Speicherzelle gelöscht, stattdessen verweist der Zeiger dann auf eine ganz bestimmte Zelle im Speicher. Der Verweis auf diese Zelle hat dann die Bedeutung "leer" bzw. null.
Eine String Variable kann null oder "" enthalten, letzteres ist aber ungleich null, es handelt sich lediglich um einen String mit 0(!) Zeichen.
Wenn ein Rechenergebnis ungültig ist, wird die Number Variable auf null gesetzt, so kann eine nachfolgende Berechnung nicht mit einem falschen Ausgangswert arbeiten.