Nullwert
Als Nullwert (kurz NULL, NIL oder ()) bezeichnet
man in der Informatik einen Zustand,
der das Fehlen eines Wertes anzeigen soll. Nach Edgar F. Codd unterscheidet man zwei Arten
von NULL
: die Abwesenheit
eines Wertes, weil keiner existiert ("property inapplicable"), oder die
Abwesenheit, da man den Wert (noch) nicht kennt ("value at present
unknown").
Ein Nullwert steht für die Abwesenheit eines Wertes, ein Nullwert ist aber
gleichzeitig ein Wert.
Der Nullwert ist verschieden von der Zahl 0
, da diese einen
Wert, also eine Information repräsentiert. Sprachlich wird gelegentlich der
Nullwert von der algebraischen Zahl 0 durch die Aussprache unterschieden,
indem (wie im Englischen)
['nʌl]
gesprochen wird, um Missverständnisse zu vermeiden.
Beispiel 1
Folgendes Beispiel verdeutlicht die Bedeutung von NULL
in
Datenbanken und Programmen: In einer Datentabelle sollen Ärzte je eine Diagnose
pro Patient eintragen, nachdem sie diesen untersucht haben. Was bedeutet es nun,
wenn in dieser Tabelle zu einem Patienten keine Diagnose eingetragen ist? Ist er
gesund oder einfach noch nicht untersucht?
In Papierlisten ist es deshalb üblich, leere Felder durchzustreichen, um zu
verdeutlichen, dass das Feld bewusst bearbeitet wurde und es tatsächlich leer
sein soll. In Datenbanken haben Felder, die noch nicht bearbeitet wurden (oder
die aus anderen Gründen keinen Wert enthalten), den Wert NULL
.
Sobald man gezielt einen Wert einträgt, verschwindet NULL
und der
eingetragene Wert, der auch leer (keine Diagnose, also gesund) sein kann, wird
gespeichert.
Beispiel 2
Man denke sich, in einer Datenbank oder einer langen Liste sollen die Telefonnummern von Studenten gespeichert werden. Man definiert also, dass eine Spalte der Tabelle nur Zahlen enthalten darf. Trifft man nun auf einen Studenten, der kein Telefon besitzt, so würde man anstelle der Telefonnummer in sein Telefonnummernfeld wahrscheinlich einen Strich setzen, oder vielleicht das Zeichen „n/a“ oder ein Fragezeichen. All diese Zeichen sollen bedeuten: Wert nicht bekannt oder nicht vorhanden. Genau das erledigt bei elektronischer Speicherung der Nullwert.
Darstellung im Computer
Möchte man in einer Computerliste so einen „Strich“ setzen, braucht dieser „Strich“ eine digitale Darstellungsform. Es gibt hier zwei Herangehensweisen:
Gleichsetzung vereinbarter gültiger Werte mit Undefiniertheit
Hierbei erwählt man einen formal gültigen Wert des Feldes willkürlich als Nullwert. Welcher der Nullwert ist, wird entweder aus dem Kontext ersichtlich oder muss explizit dokumentiert werden.
Sind in einer Tabelle Zitate von Aposteln angegeben, so könnte man in die letzte Spalte Zahlenwerte von 1 bis 12 schreiben, die angeben, welcher der Apostel Jesu hier zitiert wird. Ist es unbekannt, könnte man nun den Wert 13 oder −1 hinschreiben, und damit meinen, dass nicht bekannt ist, welcher es war, oder ob es überhaupt ein Jünger Jesu war, oder dass mit Sicherheit kein Jünger Jesu zitiert wird.
Der Vorteil dieser Methode ist, dass man grundsätzlich dabei Speicherplatz spart. Der Nachteil ist, dass ein ursprünglich als Nullwert definierter Wert in Konflikt mit einem tatsächlichen Wert kommen kann. Denke man bei obiger Liste an einen Nullwert 13, so kann es ja passieren, dass eines Tages der Apostel Paulus zitiert wird, und ihm die Zahl 13 zugewiesen wird, die nun vielleicht unbemerkt im Konflikt steht mit einem Zitat Goethes.
Dieses Problem ist in der Vergangenheit wiederholt aufgetreten, unter anderem als Jahr-2000-Problem.
Nullwert als grundverschiedener Wert
Um obiges Problem zu vermeiden, kann man den Nullwert unmissverständlich von den gültigen Werten trennen, indem man ein besonderes Zeichen einführt, das in allen Kontexten immer nur ein Nullwert ist.
Eine technische Umsetzung bietet sich bei Programmiersprachen an, die Variablen vom Typ Zeiger kennen, also als Verweis auf den eigentlichen Wert. Nun kann man eine bestimmte Stelle im Arbeitsspeicher bestimmen, die als Nullwert – und nur als Nullwert – verstanden wird. Unter den vielen Möglichkeiten einer Verabredung bietet sich die Verabredung auf Null deshalb in besonderer Weise an, weil eine Dereferenzierung eines auf die Adresse 0 zeigenden Zeigers auf den meisten Betriebssystem-Maschinen-Kombinationen zum Crash führt. Enthält die obige Tabellenspalte normalerweise nur Zeiger auf Telefonnummern, dann liegt es nahe, dem Nullzeiger die Bedeutung zu geben, dass sich an dieser Stelle die leere Telefonnummer befindet.
In der Programmiersprache C
existiert für diesen Zweck der sogenannte Nullzeiger (engl. null
pointer). Im Programmtext kann eine Nullzeiger-Konstante (null pointer
constant) durch eine (beliebige) integer constant expression (ein
konstanter ganzzahliger Ausdruck, der gewissen Bedingungen genügen muss) mit
Wert 0‚ optional mit einem Cast nach void*
versehen, ausgedrückt
werden (ISO/IEC
9899:1999 6.3.2.3 Abs. 3). Die C-Standard-Bibliothek stellt ein Makro
NULL
zur Verfügung, welches zu einem solchen Ausdruck
expandiert.
In C++ kann
eine Nullzeiger-Konstante keinen Cast nach void*
enthalten (ISO/IEC
14882:1998 4.10 Abs. 1), dies gilt in C++ infolge auch für das Standard-Makro
NULL
, welches daher in C++ meist nur zum Integer-Wert
0
expandiert. Da dies zu anderen Problemen führt – so ist diese
Konstante vom Typ int
und kein Zeigertyp – wurde in C++11 ein
neues Schlüsselwort für die Nullzeigerkonstante eingeführt:
nullptr
. Diese Konstante ist von einem eigenen Datentyp
(std::nullptr_t
), der in einen beliebigen Zeigertyp (Daten-,
Funktionszeiger), nicht jedoch in einen Ganzzahlausdruck konvertiert werden
kann.
In C# ist
null
der Standardwert für Referenz-Typen wie Object, String oder
List. Es ist daher bei der Verwendung dieser Typen von Wichtigkeit, diese vor
der Verwendung zu initialisieren, beziehungsweise vor der Verwendung zu prüfen,
ob die Variable derzeit den Wert null
besitzt. Simple
Typen wie int können hingegen nicht mit null
belegt werden und
müssen daher mit einem echten Wert wie 0 belegt werden. Seit C# 2.0 gibt es
jedoch auch die Möglichkeit der Verwendung von sogenannten Nullable
Typen, die es erlauben, auch simple Typen wie int oder bool mit
null
zu belegen.
Andere Programmiersprachen, etwa Java, stellen ein dediziertes Schlüsselwort für den Nullwert zur Verfügung. In manchen dynamisch getypten Sprachen wie Smalltalk gibt es ein spezielles vordefiniertes Null-Objekt, das die Funktion eines kanonischen Nullwertes übernimmt.
NULL in SQL-Datenbanken
Einordnung und Behandlung entsprechend der Datenbanklogik
Relationale Datenbanksysteme setzen eine Dreiwertige Logik ein, die in der Abfrage- und Aktualisierungssprache SQL realisiert wird: Hier gilt Unknown als dritter Wahrheitswert neben False und True. Die üblichen logischen Verknüpfungen Und und Oder werden angepasst, indem man False=0, True=1 und Unknown=½ setzt. Dann gilt zwischen zwei Wahrheitswerten a, b: , sowie .
In SQL ist NULL kein Wert, da die grundlegende Eigenschaft von Werten,
nämlich sie mit anderen Werten des gleichen Datentyps
vergleichen zu können, nicht das gewünschte Ergebnis liefert. Beispielsweise
ergibt das Prädikat Spalte = NULL
immer unknown, auch wenn
ein Wert in der Spalte NULL
ist. Stattdessen müssen die Prädikate
IS NULL
und IS NOT NULL
verwendet werden, um einen
Wert auf NULL
zu testen.
Einerseits spricht man von der sogenannten Don’t-know-Unbestimmtheit
und meint damit die bereits beschriebene Unkenntnis des Wertes, andererseits
gibt es die sogenannte Don’t-Care-Unbestimmtheit,
die in Datenbanken auftritt, wenn ein Datensatz einen bestimmten Wert ganz
einfach nicht benötigt. Ein leicht einsehbares Beispiel ist der Fall einer
Dokumentendatenbank, in der eine Tabelle mit verschiedenen multimedialen
Dokumenten verwaltet wird – zum Beispiel Bücher und CDs. Die
Tabelle kann neben allgemeinen Angaben wie Name, Thema,
Regalstandort auch medienspezifische Spalten wie ISBN
oder Interpreten haben. In diesem Fall hätten alle Einträge über CDs in
der Spalte ISBN NULL
als Wert, da in der Regel nur Bücher
eine ISBN haben. Dementsprechend hätten die meisten Bücher (Ausnahme Hörbücher)
in der Spalte Interpret eine NULL
stehen, da Bücher eher von
Autoren als von Interpreten erstellt werden.
Die gängige Lehrmeinung besagt nun aber, dass das Auftreten von Don’t-care-Unbestimmtheiten auf Fehler im Entwurf der Datenbank hinweist. Kurzum sollte die Datenbank von vornherein so geplant sein und implementiert werden, dass Don’t-care-NULLen nie auftreten.
Not Null
Das aus der Datenbanksprache SQL entlehnte
Sprachkonstrukt not null
(engl. für auf jeden Fall ein Wert) beschreibt die Anforderung, dass
NULL
in einem ausgezeichneten Zusammenhang unzulässig ist. In SQL
ist NOT NULL
ein sehr gebräuchlicher Constraint,
also eine Integritätsbedingung, deren Einhaltung von der Software grundsätzlich
erzwungen wird.
So wird in der Beschreibung von Bedienoberflächen durch den Hinweis not
null
darauf hingewiesen, dass ein Datenfeld in der Ausgabe grundsätzlich
befüllt und/oder beim Erfassen grundsätzlich nicht leer gelassen werden darf. Im
Regelfall wird die Bedeutung von nicht leer in Letzterem Fall etwas
großzügiger ausgelegt, dass in jedem Fall ein zulässiger Wert eingetragen werden
muss, was beispielsweise Leerzeichen-Folgen ausschließen kann.
Verschiedene Repräsentationen des Nullwertes
NIL
Einige Programmiersprachen (beispielsweise Pascal, Lisp, Smalltalk,
Ruby,
Objective-C, Lua, Scala)
verwenden die Bezeichnung nil
, anstatt Null
oder
null
. Nil steht für englisch not in list
, also
nicht in der Liste. Dies hat historische Gründe, es entstammt der
Programmiersprache Lisp, die als einzige Datenstruktur den in Blattrichtung
verketteten Binärbaum
kennt, der aber gewöhnlich nur zur Darstellung einfach verketteter
Listen genutzt wird. Die Bezeichnung wurde auch für andere
Programmiersprachen übernommen, da das lateinische
Wort nil soviel bedeutet wie nichts.
NIL ist beim Computersystem Amiga
von Commodore
auch ein Device. Lenkt man zum Beispiel eine Datei nach >NIL:
um, so verschiebt man die Ausgabe praktisch ins Nichts. Dies entspricht
/dev/null unter Unix.
None
Weiterhin ist teilweise die Bezeichnung None für einen Nullwert gebräuchlich, wie z.B. in der Programmiersprache Python.
Nothing
Nothing stellt in der Programmiersprache Visual Basic eine nicht initialisierte oder auf Nothing gesetze Variable für die Instanz einer Klasse dar. Prüfung auf Null oder Nothing erfolgen mit: If IsNull(var_Myvar) Then ... If obj_MyClass Is Nothing Then ...
null / NULL / nullptr
In Java werden Objekte nur über Referenzen angesprochen. Eine Objektreferenz,
die kein Objekt referenziert, bekommt den Wert null
zugewiesen. Dies entspricht in etwa der Verwendung des Nullzeigers in C und C++,
welcher durch das Makro NULL
oder – seit C++11 – durch das
Schlüsselwort nullptr
repräsentiert wird.
NaN
Nach der Norm IEEE 754 wird für Gleitkommazahlen mit undefinierten oder nicht darstellbaren Werten die Bezeichnung NaN (engl. not a number) verwendet. NaN sind reservierte Bitmuster, die verschieden sind von jedem erlaubten Wert. NaN ist beispielsweise Ergebnis der Division „0 durch 0“.
Sentinel oder Wächterwert
Ein Sentinel kann (wie ein NULL
-Zeiger) als „echter Wert“
nicht vorkommen. In Suchschleifen wird er mit dem Suchargument beschickt, so
dass die Programmlogik in jedem Fall auf ein Ergebnis »gefunden« läuft.
Eine Abfrage auf das Ende der Liste ist damit gleichzeitig getätigt. Nach der
Schleife wird untersucht, auf welche Weise sie beendet wurde; und wenn dies über
den Sentinel geschah, wird das Gesamtergebnis auf »nicht
gefunden« abgeändert.
Abgrenzung
Ein Nullwert kann nicht mit der Zahl Null identifiziert werden, da ein Nullwert nicht als Zahl zu verstehen ist. Ein Nullwert ist ebenso von der leeren Menge zu unterscheiden, da er nicht als Menge zu verstehen ist.
NUL
NUL ist eine häufige Abkürzung für das Nullzeichen.
Unter dem Namen NUL wird außerdem von vielen Betriebssystemen (z.B. MS-DOS und Windows) ein virtuelles Ausgabegerät definiert, das die aufgenommenen Daten einfach verwirft. Durch Umleitung nach NUL kann beispielsweise eine unerwünschte Ausgabe eines Befehls unterdrückt werden. Dies entspricht /dev/null unter UNIX.
Siehe auch
© biancahoegel.de
Datum der letzten Änderung: Jena, den: 10.07. 2022