2013-10-03 90 views
0

我有以下代码:我不明白这个NullPointerException异常

RoomCell r = b.GetRoomCellAt(1, 2); 
assertTrue(r.isDoorway()); 

第二行与一个空指针异常失败,因为如果R没有被实例化。但是我将它设置为等于该方法检索的单元格,因此它显然不为空。

为什么我可能会得到这个错误?

+0

正如你所说,因为'r' **是'null' **。 –

+0

b.GetRoomCellAt(1,2)必须返回null。检查方法文档的来源... – Thihara

+0

,因为'b.GetRoomCellAt(1,2);'返回空 –

回答

2

函数GetRoomCellAt()可能仍然可以返回NULL

3

什么是您的完整堆栈跟踪?这是必要的,以确定哪些以下是原因:

这有可能是GetRoomCellAt没有找到值并返回null

这有可能是GetRoomCellAt实施访问一个空指针

这有可能是isDoorway实施访问一个空指针

仅供参考,它是使用@Nullable进行注解参数和返回类型

+0

+1使我阅读了关于'@ Nullable'注释。快速谷歌搜索导致我http://stackoverflow.com/questions/14076296/nullable-annotation-usage :) – icedwater

+0

如果你使用Eclipse,你现在得到内置的可空分析(尽管你可能不得不打开它)。话虽如此,我经常发现番石榴的选择性更有效。 – Uri

0
好习惯

代替

assertTrue(r.isDoorway()); 


b.GetRoomCellAt(1, 2); 

该细胞可以为空。所以只有你得到nullPointerException

0

你会得到一个NullPointerException的唯一方法是如果r确实是null。你可以把这个在您的测试条件,以确保如果r实际上null,那么会导致测试失败:

RoomCell r = b.GetRoomCellAt(1, 2); 
assertNotNull(r); 
assertTrue(r.isDoorway()); 

如果rnull,那么测试的早期失败,并且避免了NPE。