web-dev-qa-db-fra.com

Attraper nullpointerexception dans Java

J'ai essayé d'utiliser le bloc try-catch pour attraper NullPointerException mais le programme suivant donne toujours des erreurs. Suis-je en train de faire quelque chose de mal ou existe-t-il un autre moyen d'attraper NullPointerException dans le programme suivant. Toute aide est grandement appréciée.

public class Circular_or_not 
{

    /**
     * @param args
     */
    public static void main(String[] args) 
    {
        // TODO Auto-generated method stub
        try
        {
            LinkedListNode[] nodes = new LinkedListNode[10];            
            for (int i = 0; i < 10; i++) 
            {
                nodes[i] = new LinkedListNode(i, null, i > 0 ? nodes[i - 1] : null);
            }

            // Create loop;
            // nodes[9].next = nodes[3];
            Boolean abc= Check_Circular(nodes[0]);
            System.out.print(abc);
        }
        catch(NullPointerException e)
        {
            System.out.print("NullPointerException caught");
        }

    }

    public static boolean Check_Circular(LinkedListNode head) 
    {       
            LinkedListNode n1 = head;
            LinkedListNode n2 = head; 

            // Find meeting point
            while (n2.next != null)
            { 
                n1 = n1.next; 
                n2 = n2.next.next; 
                if (n1 == n2) 
                { 
                    return true;
                }
            }
            return false;
    }

}
17
jags

NullPointerException est une exception au moment de l'exécution qui n'est pas recommandée pour l'attraper, mais plutôt l'évitez:

if(someVariable != null) someVariable.doSomething();
else
{
    // do something else
}
37
Eng.Fouad

Comme déjà indiqué dans une autre réponse, il est pas recommandé d'attraper une NullPointerException. Cependant, vous pouvez certainement l'attraper, comme le montre l'exemple suivant.

public class Testclass{

    public static void main(String[] args) {
        try {
            doSomething();
        } catch (NullPointerException e) {
            System.out.print("Caught the NullPointerException");
        }
    }

    public static void doSomething() {
        String nullString = null;
        nullString.endsWith("test");
    }
}

Bien qu'un NPE puisse être intercepté, vous ne devriez certainement pas le faire, mais corriger le problème initial, qui est la méthode Check_Circular.

16
elToro

Le problème avec votre code est dans votre boucle dans Check_Circular. Vous avancez dans la liste en utilisant n1 en parcourant un nœud à la fois. En réaffectant n2 à n2.next.next, vous progressez deux fois à la fois.

Lorsque vous faites cela, n2.next.next peut être nul, donc n2 sera nul après l'affectation. Lorsque la boucle se répète et vérifie si n2.next n'est pas nul, il lève le NPE car il ne peut pas passer au suivant car n2 est déjà nul.

Vous voulez faire quelque chose comme ce qu'Alex a publié à la place.

3
yogaphil

Je pense que votre problème est à l'intérieur de CheckCircular, dans l'état:

Supposons que vous avez 2 nœuds, les premiers N1 et N2 pointent vers le même nœud, puis N1 pointe vers le deuxième nœud (dernier) et N2 pointe vers null (car c'est N2.next.next). Dans la boucle suivante, vous essayez d'appeler la méthode 'next' sur N2, mais N2 est null. Voilà, NullPointerException

2
Hernán Erasmo

Vous devriez attraper NullPointerException avec le code ci-dessus, mais cela ne change pas le fait que votre Check_Circular est faux. Si vous corrigez Check_Circular, votre code ne lancera pas NullPointerException en premier lieu et fonctionnera comme prévu.

Essayer:

public static boolean Check_Circular(LinkedListNode head)
{
    LinkedListNode curNode = head;
    do
    {
        curNode = curNode.next;
        if(curNode == head)
            return true;
    }
    while(curNode != null);

    return false;
}
1
Alex