我目前有一个枚举列表。枚举列表是随机填充的,因此有可能具有值null
.这是合乎逻辑的,因为它不会被填满。
问题进一步出现在我的代码中:
if (player.Enumlist().get(CART_BLACK) > 0) {
}
Java抛出了一个NullPointerException
。我可以在 if 语句中添加一些东西来防止此错误吗?
如果get(CART_BLACK)
可能返回空值:
获取条件之前的值,如果为 null,则将其替换为负值:
Integer cartBlack = player.Enumlist().get(CART_BLACK);
if (cartBlack == null) cartBlack = -1;
if (cartBlack > 0) {
如果player.Enumlist()
可能返回空
值相似,但不太相同:
final Enumlist list = player.Enumlist();
final int cartBlack = list == null ? -1 : list.get(CART_BLACK);
if (cartBlack > 0) {
您需要防止无效:
if(player.Enumlist().get(CART_BLACK) != null &&
player.Enumlist().get(CART_BLACK) > 0) {...}
或更有效的版本:
Integer temp = player.Enumlist().get(CART_BLACK);
if (temp != null && temp > 0){...}
if( player.Enumlist().get(CART_BLACK) != null && player.Enumlist().get(CART_BLACK) > 0) {
}
这将起作用,因为ifs是从左到右检查的,如果一个条件失败,则不会评估其余条件,并且您将不会获得NPE。
最后纠正问题可以解决问题,但这并不好,因为这意味着它可能发生在其他调用中。 此外,因此,您可能会过度使用非空守卫来完成,因为您永远不会知道null
是否是正常情况。
因此,您应该倾向于使用Optional
(Java 8或Guava(作为返回而不是null
,以使API更清晰(它可能返回一个空的东西,因此传达(和更健壮(必须专门解开包含的对象(。
例如:
Optional<Integer> optValue = player.Enumlist().get(CART_BLACK);
optValue.filter(v -> v > 0)
.ifPresent( v -> ...);
您需要执行空检查:
if (player == null || player.Enumlist () == null) {
throw new Exception("Player or Enumlist cannot be null");
}
您还应该检查Integer
值是否null
,但我想如果您编写代码,那会很奇怪。
您正在使用get
,最终可能会给您带来IndexOutOfBoundsException
。您可以使用size
方法或使用streams
进行检查。
If (player.Enumlist().size() > CART_BLACK && player.Enumlist().get(CART_BLACK) != null && player.Enumlist().get(CART_BLACK) > 0) {
//...
}
您可以检查 Null 也可以使用 try.. 处理异常。捕获块
try
{
if( player.Enumlist().get(CART_BLACK)!=null && player.Enumlist().get(CART_BLACK) > 0)
{
}
}
catch(NullPointerException)
{
//handle exception here
}