2013-02-28 11 views
13

try-catchブロックを使用してNullPointerExceptionをキャッチしようとしましたが、次のプログラムでもエラーが発生しています。間違ったことをやっているのですか、それとも次のプログラムでNullPointerExceptionをキャッチする方法がありますか?どんな助けも高く評価されます。Javaで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; 
    } 

} 
+2

"エラーが発生しています" ...確かにあなたはそれよりも具体的にすることができますか? – meriton

+0

LinkedListNodeクラスの使い方が明確ではありません。たとえば、このようなクラスはorg.jivesoftware.util.LinkedListNodeです。 – user1929959

+0

コーディング提案。クラスとメソッドに名前を付けるときは、規約に従ってください。 – Ankit

答えて

26

NullPointerExceptionそれをキャッチが、代わりにそれを避けるために推奨されていないランタイム例外である:あなたは上記のコードでNullPointerExceptionをキャッチする必要があります

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

特に、あなたが見つけたいと思っているものが見つからないので、それを捕まえてもプログラムの他の部分に伝わる可能性があります。 –

1

、それは変更されません。あなたの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

NPEを捕まえるべきではありません。 – elToro

2

私はあなたの問題はwhile条件で、CheckCircularの内側にあると思う:

をし、その後N1ポイント、あなたが同じノードに2つのノード、最初のN1とN2のポイントを持っていると仮定2番目のノード(last)とN2はnullを指しています(N2.next.nextなので)。次のループでは、N2上で 'next'メソッドを呼び出そうとしますが、N2はnullです。あなたはそれを持っています、NullPointerException

3

あなたのコードの問題はあなたのループでCheck_Circularにあります。あなたは一度に1つのノードに行くことによってn1を使用してリストを進めています。 n2をn2.next.nextに再割り当てすると、一度に2つずつ進んでいきます。

これを実行すると、n2.next.nextがnullになることがあるので、割り当て後にn2がnullになります。ループが繰り返され、n2.nextがヌルでないかどうかを確認すると、n2がすでにヌルであるため、次へ進むことができないため、NPEをスローします。

代わりにAlexが投稿したようなことをしたいと思います。

11

すでに他の回答の中に記載されているように、ではなく、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方法で初期の問題を、解決するべきではありませんキャッチすることができますが。

関連する問題