2010-01-27 4 views
2

Il existe une méthode d'une bibliothèque tierce que nous utilisons (je ne peux pas la nommer parce que c'est une solution commerciale) qui a une méthode qui ressemble plus ou moins à ceci (beaucoup et lots params):NullPointerException mais pas de paramètres NULL passés à la fonction

numerix.setPrice(Instrument instrument,YieldCurve yc,TradeDate date,Currency c,...) 

Je suis sûr à 100% que chaque paramètre que je passe est non nul. Pourtant, je reçois une exception NullPointerException à l'intérieur de la méthode.

Comment cela peut-il être?

De plus, je n'ai pas de numéro de ligne dans la trace de la pile alors comment puis-je le déboguer?

+1

Vous pouvez exécuter le fichier jar dans un décompilateur et voir ce que fait réellement la méthode. Parfois c'est assez évident, parfois non. C'est souvent un bon substitut à la documentation. – Seth

+1

Vous avez mentionné que vous ne pouvez pas nommer la solution tierce et que vous avez fait exactement cela avec votre fragment de code;) –

Répondre

3

Il est possible qu'un membre d'un de vos paramètres soit nul, et la méthode setPrice essaye de l'utiliser. Par exemple, la classe Currency peut avoir un membre format. c.format pourrait être votre pointeur nul. Vérifiez chaque membre des paramètres.

2

Il existe de nombreuses façons dont leur code peut déréférencer un pointeur nul sans aucune aide de votre part.

Ils peuvent indexer un tableau avec une valeur que vous indiquez et créer un pointeur nul. Si vous n'avez pas de source, et vous n'avez pas de support, votre seul recours est de décompiler avec la commande javap et d'utiliser un débogueur qui vous guidera à travers le code de byte.

0
  • L'objet numerix gère-t-il l'état? Peut-être que vous devez l'initialiser alors.
  • Accède-t-il aux ressources externes, aux ressources statiques, etc.?
  • Si vous n'avez pas de source, utilisez le décompilateur jd-gui pour inspecter la méthode pour voir si elle peut éventuellement se tromper.
1

Une possibilité évidente qui vient à l'esprit est que numerix est nul.

La chose à faire est de vérifier la trace de la pile sur l'exception et de voir quelle ligne la lance. Obtenez-vous l'exception sur l'appel, ou provient-il de l'intérieur de la fonction? Si ce dernier, vous êtes de retour à la réponse d'Aaron: un des paramètres pourrait être un objet avec un membre qui est nul. Ou peut-être quelque part dans le traitement à l'intérieur, la fonction crée un objet nul à cause d'un bug de ses propres entrées ou invalides. (L'échec de vérifier les entrées est sans doute un bug dans tous les cas, mais peu importe.)

Avez-vous le code source? Si c'est le cas, vous pouvez rentrer dans la ligne que la trace de la pile identifie. Si non, vous travaillez en aveugle, et le mieux que vous pouvez faire est de vérifier soigneusement tous vos paramètres.

Questions connexes