web-dev-qa-db-ja.com

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

}
17
jags

NullPointerExceptionは実行時例外であり、キャッチすることは推奨されませんが、代わりに回避してください。

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

別の回答の中ですでに述べたように、NullPointerExceptionをキャッチすることをお勧めしますnotです。ただし、次の例に示すように、間違いなくキャッチできます。

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メソッド)を修正することは絶対にすべきではありません。

16
elToro

コードの問題は、Check_Circularのループにあります。一度に1つのノードに移動して、n1を使用してリストを進みます。 n2をn2.next.nextに再割り当てすることにより、一度に2つずつ進みます。

これを行うと、n2.next.nextがヌルになる可能性があるため、割り当て後はn2がヌルになります。ループが繰り返され、n2.nextがnullでないかどうかをチェックすると、n2がすでにnullであるためnextに到達できないため、NPEがスローされます。

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

3
yogaphil

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

2つのノードがあり、最初のN1とN2は同じノードを指し、次にN1は2番目のノード(最後)を指し、N2はN2を指します(N2.next.nextであるため)。次のループでは、N2で「next」メソッドを呼び出そうとしますが、N2はnullです。そこにある、NullPointerException

2
Hernán Erasmo

上記のコードで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;
}
1
Alex