8

我需要在此公式中为书籍 [i] 创建一个空检查,我不完全确定如何去做,因为我对空检查不是很熟悉,而且在编程方面也很陌生。非常感谢任何和所有帮助!

public static double calculateInventoryTotal(Book[] books)
{
    double total = 0;

    for (int i = 0; i < books.length; i++)
    {
        total += books[i].getPrice();
    }

    return total;
}
4

8 回答 8

12

首先,您应该检查books自身是否不为空,然后只需检查是否books[i] != null

if(books==null) throw new IllegalArgumentException();

for (int i = 0; i < books.length; i++){
   if(books[i] != null){
        total += books[i].getPrice();
   }
}
于 2014-02-09T20:21:46.950 回答
4

您可以在方法中添加保护条件以确保books不为空,然后在迭代数组时检查是否为空:

public static double calculateInventoryTotal(Book[] books)
{
    if(books == null){
        throw new IllegalArgumentException("Books cannot be null");
    }

    double total = 0;

    for (int i = 0; i < books.length; i++)
    {
        if(books[i] != null){
            total += books[i].getPrice();
        }
    }

    return total;
}
于 2014-02-09T20:22:18.307 回答
3

如果您使用的是 Java 7,您可以使用Objects.requireNotNull(object[, optionalMessage]);- 检查参数是否为null. 要检查每个元素是否不为空,只需使用

if(null != books[i]){/*do stuff*/}

例子:

public static double calculateInventoryTotal(Book[] books){
    Objects.requireNotNull(books, "Books must not be null");

    double total = 0;

    for (int i = 0; i < books.length; i++){
        if(null != book[i]){
            total += books[i].getPrice();
        }
    }

    return total;
}
于 2014-02-09T20:21:00.723 回答
2

如果 Books 数组为 null,则返回零,因为它看起来方法计算提供的所有 Books 的总价格 - 如果没有提供 Books,则零是正确的值:

public static double calculateInventoryTotal(Book[] books)
{
if(books == null) return 0;
    double total = 0;
    for (int i = 0; i < books.length; i++)
    {
        total += books[i].getPrice();
    }
    return total;
}

您可以决定输入空输入值是否正确(不应该是正确的,但是......)。

于 2014-02-09T20:21:34.877 回答
2

您只需将对象与null使用==(or !=) 运算符进行比较。例如:

public static double calculateInventoryTotal(Book[] books) {
    // First null check - the entire array
    if (books == null) {
        return 0;
    }

    double total = 0;

    for (int i = 0; i < books.length; i++) {
        // second null check - each individual element
        if (books[i] != null) {
            total += books[i].getPrice();
        }
    }

    return total;
}
于 2014-02-09T20:22:21.083 回答
1

在你的 for 循环中,只需添加以下行:

if(books[i] != null) {
     total += books[i].getPrice();
}
于 2014-02-09T20:21:57.230 回答
1

这个问题比较老了。此时提问者可能已经变成了一位经验丰富的 Java 开发人员。然而,我想在这里添加一些对初学者有帮助的意见。

对于 JDK 7 用户,这里使用

Objects.requireNotNull(object[, optionalMessage]);

不安全。如果它NullPointerException找到null对象并且它是一个RunTimeException.

那将终止整个程序!所以最好检查null使用==or !=

另外,使用List代替Array. 虽然访问速度是一样的,但是使用CollectionsoverArray有一些好处,比如如果你以后决定更改底层实现,你可以灵活地做到这一点。例如,如果您需要同步访问,您可以将实现更改为 aVector而无需重写所有代码。

public static double calculateInventoryTotal(List<Book> books) {
    if (books == null || books.isEmpty()) {
        return 0;
    }

    double total = 0;

    for (Book book : books) {
        if (book != null) {
            total += book.getPrice();
        }
    }
    return total;
}

另外,我想对@1ac0 的回答投赞成票。我们在写作时也应该理解和考虑方法的目的。调用方法可以根据被调用方法的返回数据进一步实现逻辑。

此外,如果您使用 JDK 8 进行编码,它引入了一种新方法来处理 null 检查并保护代码免受NullPointerException. 它定义了一个名为Optional. 详细看看这个

最后,请原谅我的英语不好。

于 2018-04-20T21:52:16.587 回答
0
public static double calculateInventoryTotal(Book[] arrayBooks) {

    final AtomicReference<BigDecimal> total = new AtomicReference<>(BigDecimal.ZERO);
    Optional.ofNullable(arrayBooks).map(Arrays::asList).ifPresent(books -> books.forEach(book -> total.accumulateAndGet(book.getPrice(), BigDecimal::add)));
    return total.get().doubleValue();

}
于 2018-04-21T08:02:53.310 回答