27

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

}
4

5 回答 5

49

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

if(someVariable != null) someVariable.doSomething();
else
{
    // do something else
}
于 2013-02-28T21:53:56.873 回答
20

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

于 2013-02-28T22:09:04.417 回答
3

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

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

您想做一些类似于 Alex 发布的内容。

于 2013-02-28T22:05:19.217 回答
2

我认为您的问题在 CheckCircular 内部,在 while 条件下:

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

于 2013-02-28T22:02:07.143 回答
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;
}
于 2013-02-28T21:57:50.357 回答