web-dev-qa-db-fra.com

Objet Java Null Check for method

Je dois créer un chèque nul dans cette formule pour les livres [i] et je ne suis pas tout à fait sûr de savoir comment procéder, car je ne suis pas très familiarisé avec les chèques nuls et que je suis très nouveau en programmation. Toute aide est très appréciée!

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

D'abord, vous devriez vérifier si books n'est pas nul, puis vérifiez si 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();
   }
}
11
Kuba Spatny

Vous pouvez ajouter une condition de garde à la méthode pour vous assurer que books n'est pas null, puis recherchez la valeur null lors de l'itération du tableau:

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

Si vous utilisez Java 7 Vous pouvez utiliser Objects.requireNotNull(object[, optionalMessage]); - pour vérifier si le paramètre est null. Pour vérifier si chaque élément n'est pas null, utilisez simplement

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

Exemple: 

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

Vous comparez simplement votre objet à null en utilisant l'opérateur == (ou !=). Par exemple.:

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

Si array of Books est null, retourne zéro car il semble que la méthode compte le prix total de tous les livres fournis - si aucun livre n'est fourni, zéro est la valeur correcte:

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

C'est à vous de décider s'il est correct de pouvoir entrer une valeur d'entrée nulle (il ne faut pas que ce soit correct, mais ...).

2
1ac0

Dans votre boucle for, ajoutez simplement la ligne suivante:

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

Cette question est assez ancienne. L'interrogateur aurait peut-être déjà été transformé en développeur Java expérimenté. Pourtant, je souhaite ajouter ici une opinion qui aiderait les débutants.

Pour les utilisateurs de JDK 7, utilisez ici 

Objects.requireNotNull(object[, optionalMessage]);

n'est pas en sécurité. Cette fonction lève NullPointerException si elle trouve un objet null et qui est une RunTimeException.

Cela mettra fin au programme entier !!. Il vaut donc mieux vérifier null en utilisant == ou !=.

Utilisez également List au lieu de Array. Bien que la vitesse d'accès soit identique, l'utilisation de Collections sur Array présente certains avantages, par exemple si vous décidez de modifier ultérieurement l'implémentation sous-jacente, vous pouvez le faire de manière flexible. Par exemple, si vous avez besoin d’un accès synchronisé, vous pouvez remplacer l’implémentation par Vector sans réécrire tout votre code.

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

De plus, je voudrais faire un vote @ 1ac0 sur la réponse . Nous devrions aussi comprendre et considérer le but de la méthode lors de l'écriture. La méthode appelante peut avoir d'autres logiques à implémenter en fonction des données renvoyées par la méthode appelée.

De plus, si vous codez avec JDK 8, il a introduit un nouveau moyen de gérer la vérification de nullité et de protéger le code de NullPointerException. Il a défini une nouvelle classe appelée Optional. Regardez ceci pour plus de détails

Enfin, pardon mon mauvais anglais.

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

}