Захват nullpointerexception в Java

Я попытался использовать блок try-catch, чтобы поймать NullPointerException но при этом следующая программа дает ошибки. Я делаю что-то неправильно или есть другой способ поймать NullPointerException в следующей программе. Любая помощь высоко ценится.

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

}

Ответ 1

NullPointerException - исключение времени выполнения, которое не рекомендуется перехватывать, но вместо этого избегайте:

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

Ответ 2

Как уже было сказано в другом ответе, не рекомендуется улавливать исключение NullPointerException. Однако вы определенно можете поймать его, как показано в следующем примере.

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

Хотя NPE можно поймать, вы определенно не должны этого делать, но исправить исходную проблему, которая является методом Check_Circular.

Ответ 3

Проблема с вашим кодом находится в вашем цикле в Check_Circular. Вы продвигаетесь через список, используя n1, перейдя по одному узлу за раз. Переставляя n2 в n2.next.next, вы продвигаетесь через него по два за раз.

Когда вы это сделаете, n2.next.next может быть пустым, поэтому n2 будет иметь значение null после назначения. Когда цикл повторяется и он проверяет, не является ли n2.next нулевым, он выбрасывает NPE, потому что он не может перейти к следующему, поскольку n2 уже имеет значение null.

Вы хотите сделать что-то вроде того, что Алекс написал вместо этого.

Ответ 4

Я думаю, что ваша проблема находится внутри CheckCircular, в то время как условие:

Предположим, что у вас есть 2 узла, первые N1 и N2 указывают на один и тот же узел, затем N1 указывает на второй узел (последний), а N2 указывает на нуль (поскольку это N2.next.next). В следующем цикле вы пытаетесь вызвать "следующий" метод на N2, но N2 имеет значение NULL. Там у вас это, NullPointerException

Ответ 5

Вы должны поймать NullPointerException с помощью кода выше, но это не меняет того факта, что ваш Check_Circular ошибочен. Если вы исправите Check_Circular, ваш код не будет генерировать NullPointerException в первую очередь и работать по назначению.

Пытаться:

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

    return false;
}