web-dev-qa-db-ja.com

Javaメソッドのオブジェクトヌルチェック

本[i]のこの式でnullチェックを作成する必要がありますが、nullチェックにあまり精通しておらず、プログラミングが非常に新しいため、これをどのように実行するか完全にはわかりません。すべての助けが大歓迎です!

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

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

    return total;
}
7
CoShark

最初にbooks自体がnullでないかどうかを確認し、次に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();
   }
}
12
Kuba Spatny

メソッドにガード条件を追加して、booksがnullでないことを確認してから、配列を繰り返すときにnullをチェックできます。

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;
}
4
Kevin Bowersox

Java 7を使用している場合、Objects.requireNotNull(object[, optionalMessage]);-を使用して、パラメータがnullかどうかを確認できます。各要素が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;
}
3
Svetlin Zarev

==(または!=)演算子を使用して、オブジェクトをnullと比較するだけです。例えば。:

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;
}
2
Mureinik

Booksの配列がnullの場合、メソッドは提供されるすべてのBooksの合計価格をカウントするように見えるため、ゼロを返します。Bookが提供されない場合、ゼロは正しい値です。

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;
}

Null入力値を入力できるかどうかを判断するのはあなた次第です(正しくないかもしれませんが...)。

2
1ac0

Forループ内に、次の行を追加するだけです。

if(books[i] != null) {
     total += books[i].getPrice();
}
1
John

この質問はかなり古いです。質問者は、この時点で経験豊富なJava開発者になっている可能性があります。ただし、初心者に役立つ意見をここに追加します。

JDK 7ユーザーの場合、ここで使用

Objects.requireNotNull(object[, optionalMessage]);

安全ではありません。この関数は、NullPointerExceptionオブジェクトを検出し、nullである場合、RunTimeExceptionをスローします。

これでプログラム全体が終了します!!。したがって、==または!=を使用してnullを確認してください。

また、Listの代わりにArrayを使用します。アクセス速度は同じですが、CollectionsArrayよりも使用することには、基礎となる実装を後で変更することを決定した場合など、いくつかの利点があります。たとえば、同期アクセスが必要な場合、すべてのコードを書き換えずに実装をVectorに変更できます。

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という新しいクラスを定義しました。 詳細はこちらをご覧ください

最後に、私の悪い英語をご容赦ください。

0
rookie4evr
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();

}