Ihre Aufgabe ist es, eine Nullzeiger-Ausnahme zu generieren. Das heißt, Ihr Programm muss einen Wert akzeptieren, von dem erwartet wird, dass er nicht null ist, und eine Ausnahme / einen Fehler oder einen Absturz auslösen, da der Wert null ist.
Darüber hinaus kann es beim Lesen des Codes nicht offensichtlich sein, dass der Wert null ist. Ihr Ziel ist es, dem Leser klar zu machen, dass der Wert nicht null ist, obwohl er es tatsächlich ist.
- Anstelle von null können Sie auch nil, none, nothing oder was auch immer in Ihrer Sprache steht, verwenden. Sie können auch undefined, uninitialized usw. verwenden.
- Das Problem mit Ihrem Code muss sein, dass die Variable (überraschenderweise) null ist, wenn das Programm eine Variable erwartet, die nicht null ist.
- Ihr Programm kann auf die Null reagieren, indem es eine Ausnahme auslöst, einen Fehler auslöst, abstürzt oder was auch immer es normalerweise tut, wenn eine unerwartete Null auftritt.
Dies ist ein Beliebtheitswettbewerb, also sei schlau!
popularity-contest
underhanded
Ypnypn
quelle
quelle
Antworten:
Java
Berechnen wir den absoluten Wert einer Zahl. Java hat Math.abs für diesen Zweck, aber die Zahl, die wir verwenden, kann manchmal null sein. Wir brauchen also eine Hilfsmethode, um diesen Fall zu lösen:
Wenn x null ist, geben Sie null zurück, andernfalls verwenden Sie Math.abs ().
Der Code ist sehr einfach und klar und sollte gut funktionieren ... oder?
Verwenden Sie stattdessen diese Zeile:
funktioniert einwandfrei Ich habe darüber nachgedacht, dies zu einem Spoiler zu machen, aber ich denke, es ist genauso rätselhaft :)
Ok, eine Erklärung:
quelle
C
Jeder C-Programmierer hat diesen Fehler mindestens einmal gemacht.
Grund :
Fix:
http://ideone.com/MbQhMM
quelle
scanf
ist eine variable Funktion, und es wurde ein Argument des falschen Typs (int
) angegeben, als es erwartet wurdeint *
. Da C (ich weiß, Compiler können dies erkennen, wennscanf
) die Typen in variadic function nicht überprüfen kann, kompiliert dies glücklich.0
ist zwar ein Nullzeiger-Literal, dies gilt jedoch nur für das direkt verwendete Literal selbst, ohne es in einer Variablen zu speichern.n
enthielt nie einen Nullzeiger.PHP
Dieser hat mich ein paar Mal gebissen.
Erwartetes Ergebnis:
Tatsächliche Ergebnis:
aka NullPointerException
Grund:
quelle
CoffeeScript (auf Node.js)
In CoffeeScript
?
ist dies ein existenzieller Operator. Wenn die Variable existiert, wird sie verwendet, andernfalls wird die rechte Seite verwendet. Wir alle wissen, dass es schwierig ist, tragbare Programme zu schreiben. In diesem Fall ist das Drucken in JavaScript nicht ausreichend. Browser verwendenalert
(oderdocument.write
), Spider Schale Verwendungenprint
und Node.js Verwendungenconsole.log
. Das ist verrückt, aber das CoffeeScript hilft bei diesem Problem.Lassen Sie uns dies unter Node.js ausführen. Schließlich möchten wir sicherstellen, dass unser Skript funktioniert.
Ähm, warum würdest du dich darüber beschweren, wenn
alert
das auch nicht definiert ist?quelle
Rubin
Finden Sie awk im PATH eines Unix-Klons.
Hoppla!
Aus dem Fehler wissen wir, dass das
p.find
heißtnil.find
, sop
muss es seinnil
. Wie ist es passiert?Verfügt in Ruby
def
über einen eigenen Bereich für lokale Variablen und nimmt niemals lokale Variablen aus dem äußeren Bereich. Also die Zuordnungp = ENV['PATH'].split ':'
nicht im Umfang.Eine undefinierte Variable verursacht normalerweise
NameError
, ist aberp
ein Sonderfall. Ruby hat eine globale Methode namensp
. Sop.find { ... }
wird zum Beispiel ein Methodenaufrufp().find { ... }
. Wennp
keine Argumente vorhanden sind, wird zurückgegebennil
. (Code-Golfer verwendenp
als Abkürzung fürnil
.) Dannnil.find { ... }
erhöhtNoMethodError
.Ich behebe es, indem ich das Programm in Python umschreibe.
Es klappt!
Ich möchte wahrscheinlich, dass es gedruckt wird
awk is /usr/bin/awk
, aber das ist ein anderer Fehler.quelle
C #
With()
ist eine Erweiterungsmethode für dasstring
Objekt, die im Wesentlichen nur ein Alias für iststring.Format()
.Sieht gut aus, oder? Falsch.
Die meisten Leute, die ein wenig über die internen Besonderheiten der Sprache Bescheid wissen, werden das Problem wahrscheinlich recht schnell erkennen können, aber es ist immer noch etwas, das auf einen Blick leicht übersehen werden kann.
quelle
.GetType()
und diestypeof()
zu einem Fehler führt, wenn das Ergebnis nicht dasselbe ist. Ich denke, das Plakat wollte einen Code, der kugelsicher aussieht, was nicht der Fall ist.return string.Format(format, args);
. Wenn eine Reflektion erforderlich wäre (in einem anderen Anwendungsfall), würde mantypeof(string)
(fängt beim Kompilieren Schreibfehler ab, keine magische Zeichenfolge) verwenden, nicht die statischeGetType
Methode. Das Beispiel scheint also "unrealistisch".Unity3D
Dann vergisst du, das Asset dorthin zu ziehen und BOOM, Unity explodiert. Es passiert die ganze Zeit.
quelle
Rubin
Nur ein einfacher Code, um das Produkt eines Arrays zu nehmen.
quelle
for (int i = 0; i <= arr.length; i++)
in Java.Android
Ich sehe das zu oft. Eine Person übergibt eine Nachricht an die nächste Aktivität (möglicherweise einen Statuscode, Kartendaten usw.) und zieht am Ende eine Null aus der
Intent
.Auf den ersten Blick scheint es ziemlich vernünftig. Gerade:
In
MenuActivity.java
:In
NextActivity.java
:FWIW, das JavaDoc sagt , dass
Intent.getStringExtra(String)
das zurückkehren kannnull
, aber nur, wenn das Tag nicht gefunden wurde. Klar, ich benutze das gleiche Tag, also muss es etwas anderes sein ...quelle
C
Nur ein kurzer Blick in den Puffer, in dem der Programmierer sogar freundlich genug war, um die potenzielle Gefahr zu dokumentieren!
quelle
Nimrod
quelle
C #
Das ist klassisch. Die sehr nützliche Methode
FindStringRepresentationOf
erstellt eine neue Instanz des angegebenen Typparameters und ermittelt dann die Zeichenfolgendarstellung dieser Instanz.Es wird sicherlich verschwenderisch sein,
null
nach dem Erstellen einer neuen Instanz sofort danach zu suchen , also habe ich das nicht getan ...Nachdem Sie das Problem wie im unsichtbaren Text oben beschrieben behoben haben, versuchen Sie es ebenfalls
goodInstance.GetType()
(der Unterschied besteht darin, dass esGetType()
im Gegensatz zuToString()
nicht virtuell ist und sie es nichtoverride
im Typ finden könnenNullable<>
).quelle
C ++:
Was Sie erwarten würden, ist "Hallo Welt!" um gedruckt zu werden. Aber Sie werden nur Müll auf dem Bildschirm sehen.
Hier wird die a1 zerstört, wenn das scope init () beendet ist. Also wird a_ptr, wie es auf a1 zeigt, Müll produzieren.
quelle
C
Erläuterung
quelle