{"id":718,"date":"2010-07-24T17:46:26","date_gmt":"2010-07-24T15:46:26","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/2010\/07\/nullnullpointerexception-in-anderen-programmiersprachen-ruby-nil-scala-option-none-some\/"},"modified":"2010-07-24T17:46:26","modified_gmt":"2010-07-24T15:46:26","slug":"nullnullpointerexception-in-anderen-programmiersprachen-ruby-nil-scala-option-none-some","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2010\/07\/nullnullpointerexception-in-anderen-programmiersprachen-ruby-nil-scala-option-none-some\/","title":{"rendered":"null\/NullPointerException in anderen Programmiersprachen: Ruby, nil, Scala, Option, None, Some"},"content":{"rendered":"<p>Ist Java eine pure objektorientiere Programmiersprache? Nein, da Java einen Unterschied zwischen primitiven Typen und Referenztypen macht. Nehmen wir f\u00fcr einen Moment an, dass es primitive Typen nicht gibt. W\u00e4re Java dann eine reine objektorientierte Programmiersprache, bei der jede Referenz ein pures Objekt referenziert? Die Antwort ist immer noch nein, da es mit null etwas gibt, mit dem Referenzvariablen initialisiert werden k\u00f6nnen, aber was kein Objekt repr\u00e4sentiert und keine Methoden besitzt. Und das kann bei der Dereferenzierung eine NullPointerException geben.<\/p>\n<p>Neue Programmiersprachen gehen da etwas andere Wege und null-Referenzierungen sind nicht m\u00f6glich. In der Sprache Ruby zum Beispiel ist immer alles ein Objekt. Wo Java mit null ein \u201enicht belegt\u201c ausdr\u00fcckt, macht das Ruby mit nil. Der feine Unterschied ist, dass nil ein Exemplar der Klasse NilClass ist, genau genommen ein Singleton, was es im System nur einmal gibt. nil hat auch ein paar \u00f6ffentliche Methoden wie to_s (wie Javas toString()), was dann einen leeren String liefert. Mit nil gibt es keine NullPointerException mehr, aber nat\u00fcrlich immer noch einen Fehler, wenn auf diesem Objekt vom Typ NilClass eine Methode aufgerufen wird, die es nicht gibt.<\/p>\n<p>In Objective-C, der Standardsprache f\u00fcr iPhone-Programme, gibt es das Null-Objekt nil. \u00dcblicherweise passiert nicht, wenn eine Nachricht an das nil-Objekt gesendet wird; die Nachricht wird einfach ignoriert.<a href=\"file:\/\/\/C:\/Users\/Christian\/Documents\/My Dropbox\/Insel\/todo\/#_ftn1_9288\" name=\"_ftnref1_9288\">[1]<\/a> Es gibt Programmiersprachen, die noch etwas anders an das null-Problem herangehen. Bei der JVM-Sprache Scala gibt es f\u00fcr den Wert null einen eigenen Typ, n\u00e4mlich Null. (Null erbt von AnyRef \u2013 was wiederum von Any erbt, dem absoluten Basistyp \u2013 und Null hat sogar mit Nothing einen Untertyp). Allerdings wird Scalas null nicht so wie Rubys null genutzt sondern entspricht Java null: Der Versuch, eine genullte Variable zu dereferenzieren, f\u00fchrt zu einer NullPointerException. Anders gesagt: Scala f\u00fchrt f\u00fcr null einen Typ ein, aber eine NullPointerException ist immer noch nicht pass\u00e9. Statt aber in Scala null zur\u00fcckzugeben, nutzen Programmierer etwas anderes: eine <i>Option<\/i>. Die Klasse Option repr\u00e4sentiert optionale Werte und kommt in zwei Auspr\u00e4gungen: Some und None (entspricht Rubys nil). Statt dass wie in Java eine Methoden eine Referenz direkt zur\u00fcckgibt, geben Scala-Methoden etwas vom Typ Option zur\u00fcck, und das hei\u00dft, entweder ein None- oder Some-Objekt. Das Some-Objekt ist ein Beh\u00e4lter und speichert die eigentliche Referenz. Eine Methode mit Option-R\u00fcckgabe sieht etwa so aus: if ( WertUngleichNull ) Some(Wert) else None. Mit dem parametrisierten Konstruktor Some(Wert) kommt der Wert in das Some-Objekt. Empf\u00e4ngt der Aufrufer die R\u00fcckgabe, kann er am Typ erkennen, ob die Operation erfolgreich war oder nicht. Das ist jedoch nicht, wie eine Option \u00fcblicherweise in Scala eingesetzt wird. Denn Option-Objekte (und somit Some oder None) besitzen eine Methode getOrElse(), sodass sich f\u00fcr eine R\u00fcckgabe result vom Typ Option schreiben l\u00e4sst: result.getOrElse(alternativerWert). Repr\u00e4sentiert result ein Some-Objekt, so liefert die Implementierung von getOrElse() den gespeicherten Wert, ist es None, so liefert die Implementierung das Argument als R\u00fcckgabe. Spontan h\u00f6rt sich das jetzt noch nicht so wahnsinnig innovativ an, aber interessant wird die Option durch die Tatsache, dass Scala sie an verschiedenen Stellen intern in den Klassenbibliotheken einsetzt. Das liegt dran, dass die Option-Klasse an die 30 Methoden deklariert und viele der Methoden etwa bei Operationen auf Datenstrukturen aufgerufen werden. Wenn zum Beispiel auf allen Elementen der Liste eine Transformation durchgef\u00fchrt werden soll, und ein None-Objekt befindet sich in der Liste, passiert beim Aufruf der Transformationsmethoden auf dem None-Objekt nichts, denn dort ist die Implementierung einfach leer.<\/p>\n<hr align=\"left\" size=\"1\" width=\"33%\" \/>\n<p><a href=\"file:\/\/\/C:\/Users\/Christian\/Documents\/My Dropbox\/Insel\/todo\/#_ftnref1_9288\" name=\"_ftn1_9288\">[1]<\/a> Es gibt auch Compiler wie der GCC, der mit der Option -fno-nil-receivers dieses Verhalten abschaltet, um schnellere Maschinencode zu erzeugen. Denn letztendlich muss in Maschinencode immer ein Test stehen, der auf 0 pr\u00fcft.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ist Java eine pure objektorientiere Programmiersprache? Nein, da Java einen Unterschied zwischen primitiven Typen und Referenztypen macht. Nehmen wir f\u00fcr einen Moment an, dass es primitive Typen nicht gibt. W\u00e4re Java dann eine reine objektorientierte Programmiersprache, bei der jede Referenz ein pures Objekt referenziert? Die Antwort ist immer noch nein, da es mit null etwas [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[11],"tags":[],"class_list":["post-718","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/718","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=718"}],"version-history":[{"count":0,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/718\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=718"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=718"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=718"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}