2016-04-07 15 views
1

私は現在、指定された条件に従ってリストからオブジェクトを返す関数を書いています。それは次のようになります。"assert false;"良い練習ですか?

for (Object object : list) { 
    if (condition(object)) { 
     return object; 
    } 
} 

この関数は常にリストから何かを返す必要があります、と一致するオブジェクトが見つからなかった場合には、それが悪いの呼び出し、重大なエラーで、プログラムを停止する必要があります。

だから、私はアサーションを有効に働くように、私はループの後にだけ、次のでした:

assert false; // Will always trigger in debug mode. 
return null; // No matter anyway, an AssertionException has already been thrown. 

しかし、私はうまくかなかったのだろうか?
そうでない場合は、代わりに何をすべきですか?私自身例外を投げますか?

いずれにしても、この状況に関する基準はありますか?

+1

http://stackoverflow.com/questions/28480068/assertfalse-vs-runtimeexceptionの房のように見えますが、私は片側のデュープ・ハンマーを投げたくありません。 – yshavit

+0

文脈全体その他、問題と同様に、私はあなたがあなたのハンマーを投げる必要はないと思う。 +1私は職場で8時にデュープハンマーを笑わせるために:D –

答えて

4

私はむしろ、関数の呼び出し時に関数の戻り値をチェックしようとします。

if (yourFunctionWithList(parameter) == null) 
    //error handling, maybe throw new NPException or whatever. 
else 
    //some object was returned 

独自のExceptionクラスを作成して、必要な方法で処理することもできます。

私は個人的にはassert falseが良いとは思いません。

EDIT

それがスローされますようAssertionException程度であれば、あなたも、私は個人的にあなたが同じよう

+0

しかし、私は多くのコードからそれを呼び出すとどうなりますか?私はそれを呼び出すたびにではなく、関数の終わりにすべてを一度チェックする方が簡単ではないでしょうか? – Aracthor

+1

@yshavit right、それらを長時間使用していない私の側に誤った情報があり、編集を追加しました –

+0

@Aracthor特に何度も呼び出すと、エラー処理の詳細な機会を得るために与えられた構文を使うべきです。しかし、おそらく私はコメントの疑問を得ることはありません –

1

それを扱うことができ

throw new AssertionError ("your error msg here"); 

ようにそれを使用することができますそれらを信頼しないでください。開発環境であってもデフォルトで無効にされることがよくあります。そうすれば、静的分析ツールと他のプログラマーの両方が誤って期待どおりに動作すると見なすことがあります。

1

あなたはJavaで適切な方法であるException、投げる必要があります。

for (Object object : list) { 
    if (condition(object)) { 
     return object; 
    } 
} 
throw new Exception('Failed: no matching item found!'); 

あなたが一日あなたの心を変更して、プログラムを停止したくない場合は、例外をキャッチすることができるようになりますが。

+1

assertによってスローされたAssertionErrorを捕まえることができます。 – titogeo

+0

これに 'IllegalStateException'または' IllegalArgumentException'を使用することができます( 'list'がそれぞれインスタンス変数かメソッド引数かによって異なります) –

+0

@titogeoしかし、あなたのメソッドは何らかの形で例外を作ります見えない、無関係な:) –

2

例外を宣言またはスローする際の問題は、実際には例外ではないものを処理するために例外処理を使用する必要があることです。

また、あなたがキャッチした例外/アサーションが何を投げたのかを本当に確かめることはできません。それはかもしれませんかもしれない場所に投げられるかもしれませんが、例えば、フィルタリングコードでスローされている可能性があります - "見つからない"ケースを検出するために例外をチェックする場合、そのケースと他の問題を融合させるかもしれません

:;

代替はOptional使用することです(または、あなたは単にSet<Object>を使用することができますが、それはあなたが正確に0または1の値が発見されることを期待することを伝えていません似たクラスが事前のJava 8のためにグアバに存在します)

Optional<Object> method(List<?> list) { 
    for (Object object : list) { 
     if (condition(object)) { 
      return Optional.of(object); 
     } 
    } 
    return Optional.empty(); 
} 

ここで、あなたの呼び出しコードでは、リストに見つかった項目がないことを明示的に知っています:

Optional<Object> opt = method(list); 
if (opt.isPresent()) { 
    Object obj = opt.get(); 
    // Handle the fact it was found. 
} else { 
    // Handle the fact it wasn't found. 
} 

例外処理ではなく、追加することを忘れる可能性があります。

関連する問題