Maison Java javaDidacticiel Comment éviter l'exception de pointeur nul en Java

Comment éviter l'exception de pointeur nul en Java

Jan 18, 2017 pm 02:42 PM

Personne n’aime NullPointerException ! Existe-t-il un moyen de les éviter ? Peut être. .

Cet article abordera les technologies suivantes

1. Type facultatif (nouvellement introduit dans Java 8)
2 Classe Objects (originale dans Java 7)

Facultatif. classe en Java 8

Qu'est-ce que c'est ?

1. Un type nouvellement introduit dans Java 8
2 Il est utilisé comme wrapper pour un objet d'un type spécifié ou pour des scénarios où aucun objet (null) n'existe

Simplement. en d'autres termes, c'est une meilleure alternative pour gérer les valeurs nulles (attention : cela n'est peut-être pas si évident à première vue)

Utilisation de base

C'est un type (une classe) - Donc , comment créer une instance de ce type ?

Utilisez simplement ses trois méthodes statiques :

public static Optional<String> stringOptional(String input) {
    return Optional.of(input);
}
Copier après la connexion

Simple et clair - créez une instance contenant cette valeur Wrapper facultatif. N'oubliez pas : si cette valeur est nulle, elle lancera NPE !

public static Optional<String> stringNullableOptional(String input) {
if (!new Random().nextBoolean()) {
input = null;
}
return Optional.ofNullable(input);
}
Copier après la connexion

Je pense personnellement que c'est mieux. De cette façon, il n'y aura aucun risque de NPE - si l'entrée est nulle, un Facultatif

public static Optional<String> emptyOptional() {
return Optional.empty();
}
Copier après la connexion

vide sera renvoyé si vous voulez vraiment renvoyer une valeur "vide". Une valeur « vide » ne signifie pas null.

Bien, alors comment consommer/utiliser Facultatif ?

public static void consumingOptional() {
Optional<String> wrapped = Optional.of("aString");
if (wrapped.isPresent()) {
System.out.println("Got string - " + wrapped.get());
}
else {
System.out.println("Gotcha !");
}
}
Copier après la connexion

Le moyen le plus simple est de vérifier si le wrapper facultatif a réellement une valeur (en utilisant la méthode isPresent) - vous vous demanderez quel est l'avantage par rapport à l'utilisation de if(myObj != null). Ne vous inquiétez pas, je vais vous expliquer cela clairement.

public static void consumingNullableOptional() {
String input = null;
if (new Random().nextBoolean()) {
input = "iCanBeNull";
}
Optional<String> wrapped = Optional.ofNullable(input);
System.out.println(wrapped.orElse("default"));
}
Copier après la connexion

Vous pouvez utiliser la méthode orElse, de sorte que si la valeur encapsulée est effectivement une valeur nulle, vous pouvez l'utiliser pour renvoyer une valeur par défaut - ses avantages sont évidents. Lors de l'extraction de la valeur réelle, vous pouvez éviter la méthode évidemment redondante consistant à appeler la méthode ifPresent.

public static void consumingEmptyOptional() {
String input = null;
if (new Random().nextBoolean()) {
input = "iCanBeNull";
}
Optional<String> wrapped = Optional.ofNullable(input);
System.out.println(wrapped.orElseGet(
() -> {
return "defaultBySupplier";
}
 
));
}
Copier après la connexion

Je suis un peu confus à ce sujet. Pourquoi existe-t-il deux méthodes différentes pour le même objectif ? orElse et orElseGet peuvent évidemment être surchargés (avec le même nom mais des paramètres différents).

Quoi qu'il en soit, la différence évidente entre ces deux méthodes réside dans leurs paramètres - vous pouvez choisir d'utiliser des expressions lambda au lieu d'instances de Fournisseur pour accomplir cela (une interface fonctionnelle)

Pourquoi utiliser Facultatif est-il préférable que le contrôle nul commun ?

1. Le plus grand avantage de l'utilisation de Optionnel est que vous pouvez exprimer votre intention plus clairement - renvoyer une valeur nulle rendra les consommateurs confus (lorsque NPE se produit) si cela est renvoyé intentionnellement, vous devez donc vérifier le javadoc pour un positionnement ultérieur. L’utilisation de Facultatif est assez simple.

2. Avec Optionnel, vous pouvez complètement éviter le NPE - comme mentionné ci-dessus, l'utilisation de Option.ofNullable, orElse et orElseGet peut nous éloigner du NPE.

Un autre sauveur !

Regardez cet extrait de code

package com.abhirockzz.wordpress.npesaviors;
 
import java.util.Map;
import java.util.Objects;
 
public class UsingObjects {
 
String getVal(Map<String, String> aMap, String key) {
return aMap.containsKey(key) ? aMap.get(key) : null;
}
 
public static void main(String[] args) {
UsingObjects obj = new UsingObjects();
obj.getVal(null, "dummy");
}
}
Copier après la connexion

Lequel pourrait être vide ?

1.Objet Map
2.La clé utilisée pour la recherche
3.L'instance de l'appel de méthode

Si un NPE est lancé, comment pouvons-nous déterminer lequel il est nul ?

package com.abhirockzz.wordpress.npesaviors;
 
import java.util.Map;
import java.util.Objects;
 
public class UsingObjects {
String getValSafe(Map<String, String> aMap, String key) {
Map<String, String> safeMap = Objects.requireNonNull(aMap,
"Map is null");
String safeKey = Objects.requireNonNull(key, "Key is null");
 
return safeMap.containsKey(safeKey) ? safeMap.get(safeKey) : null;
}
 
public static void main(String[] args) {
UsingObjects obj = new UsingObjects();
obj.getValSafe(null, "dummy");
}
}
Copier après la connexion

Méthode requireNonNull

1 Si l'objet n'est pas nul, retourne lui-même
2 Si la valeur est nulle, le NPE renvoyé aura le message spécifié

.

Pourquoi est-ce mieux que if(myObj!=null) ?

Les informations de trace de pile que vous voyez verront clairement l'appel de méthode de Objects.requireNonNull. Ceci, combiné à votre propre journal d’erreurs, peut vous permettre de localiser le problème plus rapidement. . . Au moins, c'est plus rapide à mon avis.

Vous pouvez également personnaliser votre propre validateur, par exemple, implémenter un validateur simple pour vous assurer qu'il n'y a pas de valeurs nulles.

import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.function.Predicate;
 
public class RandomGist {
 
    public static <T> T requireNonEmpty(T object, Predicate<T> predicate, String msgToCaller){
        Objects.requireNonNull(object);
        Objects.requireNonNull(predicate);
        if (predicate.test(object)){
            throw new IllegalArgumentException(msgToCaller);
        }
        return object;
    }
 
    public static void main(String[] args) {
        
    //Usage 1: an empty string (intentional)
 
    String s = "";
    System.out.println(requireNonEmpty(Objects.requireNonNull(s), (s1) -> s1.isEmpty() , "My String is Empty!"));
 
    //Usage 2: an empty List (intentional)
    List list =  Collections.emptyList();
    System.out.println(requireNonEmpty(Objects.requireNonNull(list), (l) -> l.isEmpty(), "List is Empty!").size());
 
    //Usage 3: an empty User (intentional)
    User user = new User("");
    System.out.println(requireNonEmpty(Objects.requireNonNull(user), (u) -> u.getName().isEmpty(), "User is Empty!"));
}
 
    private static class User {
        private String name;
 
        public User(String name){
            this.name = name;
        }
 
        public String getName(){
            return name;
        }
    }
}
Copier après la connexion

Ne laissez pas les NPE devenir pénibles au mauvais endroit. Nous disposons de nombreux outils pour mieux lutter contre les NPE et même les éradiquer complètement !

Pour plus d'articles sur la façon d'éviter les exceptions de pointeur nul en Java, veuillez faire attention au site Web PHP chinois !


Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation? Comment fonctionne le mécanisme de chargement de classe de Java, y compris différents chargeurs de classe et leurs modèles de délégation? Mar 17, 2025 pm 05:35 PM

Le chargement de classe de Java implique le chargement, la liaison et l'initialisation des classes à l'aide d'un système hiérarchique avec Bootstrap, Extension et Application Classloaders. Le modèle de délégation parent garantit que les classes de base sont chargées en premier, affectant la classe de classe personnalisée LOA

Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave? Comment implémenter la mise en cache à plusieurs niveaux dans les applications Java à l'aide de bibliothèques comme la caféine ou le cache de goyave? Mar 17, 2025 pm 05:44 PM

L'article examine la mise en œuvre de la mise en cache à plusieurs niveaux en Java à l'aide de la caféine et du cache de goyave pour améliorer les performances de l'application. Il couvre les avantages de configuration, d'intégration et de performance, ainsi que la gestion de la politique de configuration et d'expulsion le meilleur PRA

Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux? Comment puis-je utiliser JPA (Java Persistance API) pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux? Mar 17, 2025 pm 05:43 PM

L'article discute de l'utilisation de JPA pour la cartographie relationnelle des objets avec des fonctionnalités avancées comme la mise en cache et le chargement paresseux. Il couvre la configuration, la cartographie des entités et les meilleures pratiques pour optimiser les performances tout en mettant en évidence les pièges potentiels. [159 caractères]

Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance? Comment utiliser Maven ou Gradle pour la gestion avancée de projet Java, la création d'automatisation et la résolution de dépendance? Mar 17, 2025 pm 05:46 PM

L'article discute de l'utilisation de Maven et Gradle pour la gestion de projet Java, la construction de l'automatisation et la résolution de dépendance, en comparant leurs approches et leurs stratégies d'optimisation.

Mar 17, 2025 pm 05:45 PM

L'article discute de la création et de l'utilisation de bibliothèques Java personnalisées (fichiers JAR) avec un versioning approprié et une gestion des dépendances, à l'aide d'outils comme Maven et Gradle.

See all articles