Votre tâche consiste à générer une exception de pointeur nul. C'est-à-dire que votre programme doit accepter une valeur qu'il s'attend à être non nul et lever une exception / erreur ou un crash car la valeur est nulle.
De plus, il ne peut pas être évident à la lecture du code que la valeur est nulle. Votre objectif est de faire comprendre au lecteur que la valeur n'est pas nulle, même si elle l'est réellement.
- Au lieu de null, vous pouvez utiliser nil, aucun, rien ou l'équivalent dans votre langue. Vous pouvez également utiliser non défini, non initialisé, etc.
- Le problème avec votre code doit être que la variable est (étonnamment) nulle là où le programme attend une variable non nulle.
- Votre programme peut répondre à la valeur null en lançant une exception, en lançant une erreur, en se bloquant ou quoi qu'il fasse normalement lorsqu'une valeur null inattendue est rencontrée.
Il s'agit d'un concours de popularité, alors soyez intelligent!
Réponses:
Java
Calculons la valeur absolue d'un nombre. Java a Math.abs à cet effet, mais le nombre que nous utilisons peut parfois être nul. Nous avons donc besoin d'une méthode d'aide pour traiter ce cas:
Si x est nul, retournez null, sinon utilisez Math.abs ().
Le code est très simple et clair, et devrait fonctionner correctement ... non?
Soit dit en passant, en utilisant cette ligne à la place:
fonctionne correctement. J'ai pensé à en faire un spoiler, mais .. je pense que c'est tout aussi déroutant :)
Ok, une explication:
la source
C
Chaque programmeur C a fait cette erreur, au moins une fois.
Raison:
Réparer:
http://ideone.com/MbQhMM
la source
scanf
est une fonction variadique, et un argument de type incorrect (int
) a été donné, quand il s'y attendaitint *
. Parce que C (je sais, les compilateurs peuvent détecter cela en cas descanf
) ne peut pas vérifier les types dans la fonction variadic, cela se compile avec bonheur.0
est en effet un littéral de pointeur nul, mais cela ne s'applique qu'au littéral directement utilisé lui-même, sans le stocker dans une variable.n
n'a jamais contenu de pointeur nul.PHP
Celui-ci m'a mordu plusieurs fois.
Résultat attendu:
Résultat actuel:
aka NullPointerException
Raison:
la source
CoffeeScript (sur Node.js)
Dans CoffeeScript,
?
est un opérateur existentiel. Si la variable existe, elle est utilisée, sinon le côté droit est utilisé. Nous savons tous qu'il est difficile d'écrire des programmes portables. Par exemple, l'impression en JavaScript est sous spécifiée. Les navigateurs utilisentalert
(oudocument.write
), Shell SpiderMonkey utilisationsprint
et les utilisations Node.jsconsole.log
. C'est fou, mais le CoffeeScript aide à résoudre ce problème.Exécutons cela sous Node.js. Après tout, nous voulons nous assurer que notre script fonctionne.
Uhm, pourquoi vous plaindriez-vous de cela, alors que
alert
n'est pas non plus défini?la source
Rubis
Trouvez awk dans le CHEMIN d'un clone Unix.
Oups!
De l'erreur, nous savons que
p.find
appelénil.find
,p
doit donc êtrenil
. Comment est-ce arrivé?Dans Ruby,
def
a sa propre portée pour les variables locales et ne prend jamais de variables locales de la portée extérieure. L'affectationp = ENV['PATH'].split ':'
n'est donc pas dans le champ d'application.Une variable non définie provoque généralement
NameError
, maisp
c'est un cas spécial. Ruby a une méthode globale nomméep
. Devientp.find { ... }
alors un appel de méthode, commep().find { ... }
. Quandp
n'a pas d'arguments, il revientnil
. (Code utilisé par les golfeursp
comme raccourcinil
.)nil.find { ... }
Relance ensuiteNoMethodError
.Je le corrige en réécrivant le programme en Python.
Ça marche!
Je veux probablement qu'il s'imprime
awk is /usr/bin/awk
, mais c'est un bug différent.la source
C #
With()
est une méthode d'extension à l'string
objet, qui n'est essentiellement qu'un alias pourstring.Format()
.Ça a l'air bien, non? Faux.
La plupart des gens qui connaissent un peu les spécificités internes de la langue seront probablement en mesure de repérer le problème assez rapidement, mais c'est toujours quelque chose qui est facilement oublié en un coup d'œil.
la source
.GetType()
ettypeof()
et conduisant ainsi à un défaut lorsque le résultat est le même. Je pense que l'affiche voulait un code à l'épreuve des balles qui ne l'est pas.return string.Format(format, args);
. Si la réflexion était nécessaire (dans un autre cas d'utilisation), on utiliseraittypeof(string)
(capture les erreurs de casse au moment de la compilation, pas de chaîne magique), pas laGetType
méthode statique . L'exemple semble donc "irréaliste".Unity3D
Ensuite, vous oubliez de glisser-déposer l'actif là-bas et BOOM, Unity explose. Arrive tout le temps.
la source
Rubis
Juste du code simple pour prendre le produit d'un tableau.
la source
for (int i = 0; i <= arr.length; i++)
en Java.Android
Je vois cela arriver trop souvent. Une personne transmet un message à l'activité suivante (peut-être un code d'état, des données cartographiques, etc.) et finit par extraire un null du
Intent
.À première vue, cela semble assez raisonnable. Juste:
Dans
MenuActivity.java
:Dans
NextActivity.java
:FWIW, le JavaDoc fait dire que
Intent.getStringExtra(String)
peut revenirnull
, mais seulement si l'étiquette n'a pas été trouvé. Clairement, j'utilise la même balise, donc ça doit être autre chose ...la source
C
Juste une lecture rapide du tampon, où le programmeur a même eu la gentillesse de documenter le danger potentiel!
la source
Nimrod
la source
C #
C'est classique. La méthode très utile
FindStringRepresentationOf
créera une nouvelle instance du paramètre de type spécifié, puis trouvera la représentation sous forme de chaîne de cette instance.Il sera sûrement inutile de vérifier
null
immédiatement après avoir créé une nouvelle instance, donc je ne l'ai pas fait ...Après avoir résolu le problème comme décrit dans le texte invisible ci-dessus, essayez également
goodInstance.GetType()
(la différence étant queGetType()
, contrairement àToString()
, il n'est pas virtuel, ils ne pouvaient donc pas leoverride
faire dans le typeNullable<>
).la source
C ++:
Ce que vous attendez est "Bonjour tout le monde!" à imprimer. Mais vous ne verrez que des ordures à l'écran.
Ici, l'a1 est détruit lorsque la portée init () est terminée. Donc, a_ptr, comme il pointe vers a1, produira des ordures.
la source
C
Explication
la source