在Java中捕获nullpointerexception

时间:2013-02-28 21:51:00

标签: java nullpointerexception

我尝试使用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;
    }

}

5 个答案:

答案 0 :(得分:36)

NullPointerException是一个运行时异常,建议不要捕获它,而是避免它:

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

答案 1 :(得分:16)

如前所述,另一个答案是建议捕获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方法。

答案 2 :(得分:3)

您的代码存在于Check_Circular的循环中。您通过一次运行一个节点使用n1推进列表。通过将n2重新分配给n2.next.next,您可以一次推进两个。

当你这样做时,n2.next.next可能为null,因此在赋值后n2将为null。当循环重复并检查n2.next是否为空时,它会抛出NPE,因为它无法到达下一个,因为n2已经为空。

你想要像Alex发布的那样做。

答案 3 :(得分:2)

我认为你的问题在CheckCircular中,在while条件下:

假设您有2个节点,第一个N1和N2指向同一个节点,然后N1指向第二个节点(最后一个),N2指向空(因为它是N2.next.next)。在下一个循环中,您尝试在N2上调用'next'方法,但N2为null。你有它,NullPointerException

答案 4 :(得分:1)

您应该使用上面的代码捕获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;
}