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 のループにあります。一度に 1 つのノードに移動することで、n1 を使用してリストを進めています。n2 を n2.next.next に再割り当てすることで、一度に 2 つ進みます。

そうすると、 n2.next.next が null になる可能性があるため、代入後に n2 が null になります。ループが繰り返され、n2.next が null でないかどうかを確認すると、n2 が既に null であるため next に到達できないため、NPE がスローされます。

代わりに、アレックスが投稿したようなことをしたいとします。

于 2013-02-28T22:05:19.217 に答える
2

あなたの問題はCheckCircularの内部にあり、while状態にあると思います。

2つのノードがあり、最初にN1とN2が同じノードを指し、次にN1が2番目のノード(最後)を指し、N2がnullを指していると仮定します(N2.next.nextであるため)。次のループでは、N2で「next」メソッドを呼び出そうとしますが、N2はnullです。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 に答える