2016-07-26 1 views
0

がここに私のコードです:私はタイプEの何かを返すために持っているとき、私はNullPointerExceptionを処理するにはどうすればよいJavaの機能は、一般的なデータ型のいくつかの値を返すために持っているJavaで扱うNullPointerExceptionが

public E get(int index) 
{ 
    LLNode<E> current = head; 
    try { 
     for (int i = 0; i <= index; i++) { 
      if (current != null) { 
       current = current.next; 
      } 
     } 
     return current.data; 
    } catch (IndexOutOfBoundsException e) { 
     throw e; 
    } catch (NullPointerException e) { 
     // How do I handle this? 
    } 
} 

私がテストしています私のコードはJUtilを使用しています。私は初心者であり、理解しにくいこの部分を見つけ出していますので、助けてください。

EDITは:私はJUtil機能を使用してこの機能をテストしてい(部分)コードは以下の通りである:ここでemptylist

// Test empty list, get() should throw an exception 
try { 
    emptyList.get(0); 
    fail("Check out of bounds"); 
} catch (Exception e) { 
} 

することは、個人的に作成したLinkedListのクラスから作成された空のListオブジェクトです。どうすればこの問題を解決できますか(//空のリストをテストして、getは例外をスローする必要があります)。この場合、最初に述べたget関数はNullPointerExceptionを返します。私を助けてください。

新しいコード:

public E get(int index) 
    { 
     // TODO: Implement this method. 
     LLNode<E> current = head; 
     for(int i=0; i<=index; i++) 
     { 
      if(current != null) 
      { 
       current = current.next; 
      } 
      else 
      { 
       throw new IndexOutOfBoundsException(); 
      } 
     } 
     return current.data; 
    } 

「新しいコード」を実行した後、これらは結果やエラーで左下のパネル上にある: After running tests on new code

+6

例外を処理する方法がわからない場合は、それをキャッチしないでください。 – SLaks

+0

nullを戻すか、例外をキャッチしません。 – FredK

+0

これらの例外は両方とも 'RuntimeExceptions'であり、明示的にキャッチされることはめったにありません。代わりに、その例外のいずれかが最初にスローされないように対策を講ずる必要があります。 –

答えて

4

チャンスは、あなたがそれを引くのではなく、ここでIndexOutOfBoundsExceptionを投げるために探しているされているが。

にはいくつかの明確な理由があります。

  • あなたのコードは現実的に発生する可能性があり、これはcurrent == null場合で、あなたがしたいときには理想的だと唯一の場所として、任意のNullPointerException Sを投げるべきではありませんIndexOutOfBoundsExceptionを投げてください。 try...catchずに書き換え

、あなたのコードは次のようになります。物事のルックスによって

public E get(int index) { 
    // TODO: Implement this method. 
    LLNode<E> current = head; 
    for (int i = 0; i <= index; i++) { 
     if (current != null) { 
      current = current.next; 
     } else { 
      throw new IndexOutOfBoundsException(); 
     } 

    } 
    return current.data; 
} 
+0

ソリューションを適用した後に画像を追加しました。さらに手伝ってください! –

+0

新しい質問がある場合は、新しい質問として投稿し、この質問に追加しないでください。 – Makoto

+0

申し訳ありません、ただ私は本当に緊張しています。ごめんなさい –

2

単純な、それを処理しないでください。

あなたのコードはcurrent != nullのためのあなたのチェックは、戻り値current.dataを包含していないようcurrentに割り当てられた最後の値が、null場合にのみ、NullPointerExceptionをスローします。

IndexOutOfBoundsExceptionだが、あなたはかもしれないが、はプログラムでそれを投げたい(誠の答えを参照)。

ここに小切手を追加する必要があります。

通常、NullPointerExceptionを捕まえたくない代わりに、nullの値をチェックして行動します。

またcurrentの最後の値がnullない場合は、あなたの方法nullを返すことがありますが、そのdataプロパティが必要な場合は、参照に呼び出し、その戻り値の代入時にチェックされるべきです。

編集

あなたは、プログラムの失敗時に例外をスローする必要がある場合(例えばcurrent.datanull、またはあなたは、コンテキスト内に収まると判断任意の基準である)、次の2つの「半」の方法で行うことができます。

  • Aは例外、カスタムチェックするかどうか
  • 実行時例外
  • を(その場合、あなたはあなたのメソッドのシグネチャの後にそれを投げている宣言する必要があります) 210
  • チェック例外の周りのランタイム例外ラッピング、あなたが最初の場所でスローされるNullPointerExceptionの状況に取得しない方が良い
+0

私は自分の質問を編集しました。あなたが明示的に例外をスローするように言われているので、今私を助けてください。 –

+0

@MohitGarg失敗した場合に例外をスローする必要がある場合は、プログラムで行うことができます。それはすべて失敗の条件と、スローする必要のある例外に依存します。 – Mena

0

にそれを宣言する必要はありません。

currentnullになると、リストの要素が使い果たされました。インデックスは文字通りリストの範囲外ですので、IndexOutOfBoundsExceptionを投げてください。

(とキャッチとIndexOutOfBoundsExceptionを再スローする必要はありません。ちょうどあなたのtry/catchを除く)

0

を、あなたがコードしている、これまで実際にNullPointerException(ことができる唯一のオブジェクトを生成することはできませんnullは "現在"ですが、nullをチェックします)...このブロックは実際に目的を果たしません(IndexOutOfBoundsExceptionがヒットするかどうかはわかりません)。

あなたの質問に直接答えることができます。おそらく、おそらくNullPointer(NPE)ブロックの最も意味のある戻り値は「null」です。

catch (NullPointerException e) { 
    return null; 
} 

論理的かつデザインワイズこれはおそらく意味がありません - あなたは、おそらく例外を投げる代わりに、ここで何かを返すほうが良いでしょう。たとえば、 "head"がnullで、何とかNullPointerExceptionが発生したとしましょう。この場合、get(index)がNullPointerをスローするのは意味がないかもしれません。代わりにIllegalStateExceptionのようなものをスローする方が意味があります代わりに。

catch (NullPointerException npe) { 
    // head isn't initialized correctly...it should be 
    throw new IllegalStateException("LLNode is not correctly initialized", npe) 
} 

この特定のケースでも悪いデザイン(それがnullかどうかを確認する方が良いでしょう...あなたはすでにやっているように!... VS。意図的にNullPointerExceptionをキャッチ)されて終わる...しかし、ことはありませんより意味のあるものを投げるために1つの例外をキャッチすることを怖がってください

関連する問題