2010-01-27 68 views
2

有一个我们使用的第三方库的方法(我无法命名它,因为它是一个商业解决方案),它有一个方法看起来或多或少像这样(批次和lot params):NullPointerException,但没有空参数传递给函数

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

我100%确定每个参数都是非空的。 但是我在方法里面得到了一个N​​ullPointerException。

这怎么可能?

另外我没有线路号码在堆栈跟踪,所以我怎么能调试它?

+1

您可以通过反编译器运行jar并查看该方法实际正在执行的操作。有时候很明显,有时候不是。尽管它通常是文档的很好的替代品。 – Seth 2010-01-27 17:55:36

+1

您提到您无法命名第三方解决方案并继续执行,并使用您的代码片段完成该操作;) – 2010-01-27 23:01:26

回答

3

有可能您的某个参数的成员为空,并且setPrice方法试图使用该参数。

例如,货币类可能有一个format成员。 c.format可能是你的空指针。检查每个参数的成员。

2

他们的代码有许多方法可以在没有任何帮助的情况下解引用空指针。

它们可能会为您提供的值编制一个数组并为其提供一个空指针。

如果您没有源代码,并且您没有支持,唯一的办法是使用javap命令进行反编译,并使用调试器来指导您完成字节代码。

0
  • numerix对象是否处理状态?也许你必须先初始化它。
  • 它访问外部资源,静态资源等吗?
  • 如果您没有源代码,请使用jd-gui反编译器检查该方法,看它是否可能出错。
1

想到的一个明显的可能性是,numerix为空。

要做的事情是检查异常上的堆栈跟踪,看看哪个线路正在抛出它。你是否在通话中得到异常,还是来自函数内部?如果后者,你回到亚伦的答案:其中一个参数可能是一个成员为null的对象。或者,也许在处理里面的某个地方,该函数正在创建一个空对象,因为它自己或无效输入的错误。 (在任何情况下,检查输入的失败都可能是一个错误,但无论如何。)

你有源代码吗?如果是这样,您可以在堆栈跟踪标识的行上回家。如果不是的话,你就是盲目工作,你能做的最好的就是仔细检查你的所有参数。