AlsNullwert (kurzNULL,NIL oder()) bezeichnet man in derInformatik einen Zustand, der das Fehlen eines Wertes anzeigen soll. NachEdgar F. Codd unterscheidet man zwei Arten vonNULL
: einerseits die Nicht-Existenz einer Eigenschaft („property inapplicable“, z. B. Geschmack einer Strecke), und andererseits das Fehlen des Wertes einer existierenden Eigenschaft („value at present unknown“, z. B. Länge einer noch nicht gemessenen Strecke).[1] Ein Nullwert steht zwar für die Abwesenheit eines Wertes, ist aber selbst ein Wert, der gespeichert, gelesen und verglichen werden kann.
Der Nullwert ist verschieden von der Zahl 0
, da diese eine gegebene Quantität repräsentiert.Sprachlich wird gelegentlich der Nullwert von der algebraischen Zahl 0 durch die Aussprache unterschieden, indem (wie imEnglischen) ['nʌl] gesprochen wird, um Missverständnisse zu vermeiden.
Folgendes Beispiel verdeutlicht die Bedeutung vonNULL
inDatenbanken 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 WertNULL
. Sobald man gezielt einen Wert einträgt, verschwindetNULL
, und der eingetragene Wert – der auch leer (keine Diagnose, also gesund) sein kann – wird gespeichert.
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, das Zeichen„n/a“ oder ein Fragezeichen setzen. All diese Zeichen sollen bedeuten: Wert nicht bekannt oder nicht vorhanden. Genau das erledigt bei elektronischer Speicherung der Nullwert.
Möchte man in einer Computerliste so einen „Strich“ setzen, braucht dieser „Strich“ eine digitale Darstellungsform. Es gibt hier zwei Herangehensweisen:
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 eintragen 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 dabei grundsätzlich 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 könnte es durchaus passieren, dass eines Tages der Apostel Paulus zitiert und ihm die Zahl 13 zugewiesen wird, die dann vielleicht ungewollt und unbemerkt mit einem Zitat Goethes im Konflikt stünde.
Dieses Problem ist in der Vergangenheit wiederholt aufgetreten, unter anderem alsJahr-2000-Problem.
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 TypZeiger kennen, also alsVerweis auf den eigentlichen Wert. Nun kann man eine bestimmte Stelle imArbeitsspeicher 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 eineDereferenzierung eines auf die Adresse 0 zeigenden Zeigers auf den meisten Betriebssystem-Maschinen-Kombinationen zumCrash führt. Enthält die obige Tabellenspalte normalerweise nurZeiger auf Telefonnummern, dann liegt es nahe, dem Nullzeiger die Bedeutung zu geben, dass sich an dieser Stelle dieleere 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 nachvoid*
versehen, ausgedrückt werden (ISO/IEC 9899:1999 6.3.2.3 Abs. 3). DieC-Standard-Bibliothek stellt ein MakroNULL
zur Verfügung, welches zu einem solchen Ausdruck expandiert.[2]
InC++ kann eine Nullzeiger-Konstante keinenCast nachvoid*
enthalten (ISO/IEC 14882:1998 4.10 Abs. 1); dies gilt in C++ infolgedessen auch für das Standard-MakroNULL
, welches daher in C++ meist nur zumInteger-Wert0
expandiert. Da dies zu anderen Problemen führt – so ist diese Konstante vom Typint
und kein Zeigertyp –, wurde inC++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.
InC# istnull
der Standardwert für Referenz-Typen wieObject,String oderList. 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 Wertnull
besitzt.[3] Simple Typen wieint
können hingegen nicht mitnull
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 sogenanntenNullable-Typen, die es erlauben, auch simple Typen wieint
oderbool
mitnull
zu belegen.[4]
Andere Programmiersprachen, etwaJava, stellen ein dediziertesSchlüsselwort für den Nullwert zur Verfügung. In manchen dynamisch getypten Sprachen wieSmalltalk gibt es ein spezielles vordefiniertes Null-Objekt, das die Funktion eineskanonischen Nullwertes übernimmt.
Relationale Datenbanksysteme setzen einedreiwertige Logik ein, die in der Abfrage- und AktualisierungsspracheSQL realisiert wird: Dort giltUnknown als dritter Wahrheitswert nebenFalse undTrue. Die üblichen logischen VerknüpfungenUnd (Konjunktion) undOder (Disjunktion) werden angepasst, indem man False = 0, True = 1 und Unknown = ½ setzt. Dann gilt zwischen zwei Wahrheitswerten a, b: sowie.
In SQL istNULL
kein Wert, da die grundlegende Eigenschaft von Werten – nämlich sie mit anderen Werten des gleichenDatentyps vergleichen zu können – nicht das gewünschte Ergebnis liefert. Beispielsweise ergibt das PrädikatSpalte = NULL
immerunknown, auch wenn ein Wert in der SpalteNULL
ist. Stattdessen müssen die PrädikateIS NULL
undIS NOT NULL
verwendet werden, um einen Wert aufNULL
zu testen.
Einerseits spricht man von der sogenanntenDon’t-know-Unbestimmtheit und meint damit die bereits beschriebene Unkenntnis des Wertes; andererseits gibt es die sogenannteDon’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 BeispielBücher undCDs. Die Tabelle kann neben allgemeinen Angaben wieName,Thema,Regalstandort auch medienspezifische Spalten wieISBN oderInterpreten haben. In diesem Fall hätten alle Einträge über CDs in der SpalteISBNNULL
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 SpalteInterpret eineNULL
stehen, da Bücher eher von Autoren als von Interpreten erstellt werden.
Die gängige Lehrmeinung besagt jedoch, dass das Auftreten vonDon’t-care-Unbestimmtheiten auf Fehler im Entwurf der Datenbank hinweist. Kurzum sollte die Datenbank von vornherein so geplant sein und implementiert werden, dassDon’t-care-NULLen nie auftreten.
Christopher J. Date undHugh Darwen weisen imThe Third Manifesto auf die Problematik vonNULL
in relationalen Datenbanksystemen hin und kritisieren, dass derNULL
-Wert in selbigen nicht eindeutig ist, da er entweder auf Unbekanntheit oder Nichtexistenz hinweisen kann. Sie erläutern imThird Manifesto, wie man eine relationale Datenbank ohne die Verwendung vonNULL
strukturieren kann, indem man Werte, dieNULL
enthalten können, in eigene Beziehungstabellen normalisiert.[5]
Das aus der Datenbanksprache SQL entlehnte Sprachkonstruktnot null (engl. für auf jeden Fall ein Wert) beschreibt die Anforderung, dassNULL
in einem ausgezeichneten Zusammenhang unzulässig ist. In SQL istNOT NULL
ein sehr gebräuchlicherConstraint, also eine Integritätsbedingung, deren Einhaltung von der Software grundsätzlich erzwungen wird.
So wird in der Beschreibung von Bedienoberflächen durch den Hinweisnot 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 vonnicht 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.
Einige Programmiersprachen (beispielsweisePascal,Lisp,Smalltalk,Ruby,Objective-C,Lua,Scala,Go) verwenden die Bezeichnungnil
, anstattNull
odernull
.Nil ist eine Kontraktion aus demlateinischennihil, wasnichts bedeutet. In derenglischen Sprache ist es ein Synonym fürnull. Vielfach wird im deutschsprachigen Raum angenommen,nil stehe für englischnot in list
, alsonicht in der Liste. Dies habe historische Gründe, es entstamme der Programmiersprache Lisp, die als einzige Datenstruktur den in Blattrichtung verkettetenBinärbaum kennt, der aber gewöhnlich nur zur Darstellungeinfach verketteter Listen genutzt wird. Als Nullwert wurdenil
zwar zuerst nur in Lisp genutzt mit Bedeutung einer leeren Liste, jedoch ist dies nicht aufnot in list zurückzuführen.
Weiterhin ist teilweise die BezeichnungNone für einen Nullwert gebräuchlich, wie z. B. in der ProgrammiersprachePython.
Nothing stellt in der ProgrammierspracheVisual Basic eine nicht initialisierte oder aufNothing
gesetze Variable für die Instanz einerKlasse dar.Prüfung aufNull
oderNothing
erfolgen mit:If IsNull(var_Myvar) Then ...
If obj_MyClass Is Nothing Then ...
In Java werden Objekte nur über Referenzen angesprochen. Eine Objektreferenz, diekein Objekt referenziert, bekommt den Wertnull
zugewiesen. Dies entspricht in etwa der Verwendung desNullzeigers in C und C++, welcher durch das MakroNULL
oder – seit C++11 – durch das Schlüsselwortnullptr
repräsentiert wird.
Nach der NormIEEE 754 wird fürGleitkommazahlen mit undefinierten oder nicht darstellbaren Werten die BezeichnungNaN (engl.not a number) verwendet. NaN sind reservierte Bitmuster, die verschieden sind von jedem erlaubten Wert. NaN ist beispielsweise Ergebnis derDivision „0 durch 0“.
Ein Sentinel kann (wie einNULL
-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.
Ein Nullwert kann nicht mit der ZahlNull identifiziert werden, da ein Nullwert nicht als Zahl zu verstehen ist. Ein Nullwert ist ebenso von derleeren Menge zu unterscheiden, da er nicht alsMenge zu verstehen ist.
VieleZeichensätze haben an der Code-Position 0 ein Steuerzeichen. Es wird normalerweise mitNUL abgekürzt.
Viele Betriebssysteme definieren ein virtuelles Ausgabegerät, das die aufgenommenen Daten einfach verwirft. Unter Windows ist dies etwaNUL
, unter Unix/dev/null
, unter AmigaOSNIL:
. So kann beispielsweise eine unerwünschte Ausgabe eines Befehls unterdrückt werden.
null
(C# Reference) (englisch), abgerufen am 6. Mai 2011