【问题标题】:Catching nullpointerexception in Java [closed]在 Java 中捕获 nullpointerexception [关闭]
【发布时间】:2013-02-28 21:50:59
【问题描述】:

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

}

【问题讨论】:

  • “给出错误”...您肯定可以比这更具体吗?
  • 不清楚你如何使用 LinkedListNode 类。例如,像这样的类是 org.jivesoftware.util.LinkedListNode。
  • 只是一个编码建议。命名类和方法时尽量遵循约定。

标签: java nullpointerexception


【解决方案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 在赋值后将为空。当循环重复并检查 n2.next 是否不为空时,它会抛出 NPE,因为它无法进入下一个,因为 n2 已经为空。

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

    【讨论】:

      【解决方案4】:

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

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

        【讨论】:

        • 你不应该捕获 NPE。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-12-22
        • 2012-02-05
        • 2014-07-15
        • 1970-01-01
        • 2014-12-22
        • 1970-01-01
        • 2017-09-12
        相关资源
        最近更新 更多