如何防止错误:空 > 0 java



我目前有一个枚举列表。枚举列表是随机填充的,因此有可能具有值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
}

相关内容

  • 没有找到相关文章

最新更新