2010-12-30 19 views
7

このメソッド(テスト)に戻り値が必要な理由(常にtrue)?メソッドは常にtrueを返すreturn文を必要とするのはなぜですか?

public boolean test() { //This method must return a result of type boolean 
    if (true) { 
     return true; // always return true 
    } 
} 

と私は戻り値を追加したとき、それは"デッドコード"と警告しています。なぜ最初test()方法

public boolean test(int i) { 
    if (true) { 
     return true; 
    } else { //Dead code 
     return false; 
    } 
} 
+3

文は常にtrueになるだろうされている場合は、あなただけの完全ステートメントを削除することはできませんか? –

+0

それはちょうどテストです。私は常に真実を返す方法はありません:) –

+3

これは常に真実ではないので、コードに複数のパスがあるため、各パスにreturnステートメントが必要です。 –

答えて

11

メソッドリターン解析では、条件が常に真または偽であるかどうかを解析することはありません。通常はコンパイル時定数ではありません(そうでない場合は、最初にifを記述しません)。 )。それは単に取ることができるかできないかを確認するだけであり、それが取られない場合、メソッドは値を返しません。そのためエラーです。

デッドコード分析は、メソッドのリターン解析とは別のパスで行われます。このリターン解析では、分岐条件を調べる詳細な分析が行われます。

この動作は、コンパイラがどのように開発されたかのアーチファクトです。メソッドの戻り解析は、最終的に有効なプログラムを確実に取得できるように、コンパイルの重要な部分です。最初に実装されたコア機能の1つです。デッドコード解析は「いいです」ということで、後で実装され、より高度なアルゴリズムを使用しています(コアコンパイラビットがその段階で終了したため)

+0

コンパイラは条件が – Babar

2

を受け入れていないので、それはコンパイラが行う分析の深さの結果です。

1

このメソッドは何もしないので、そうですデッドコード。メソッドが常にtrueを返す場合は、呼び出す必要はありません。代わりにtrueを使用してください。

+0

の場合は評価されません。 –

+1

@hilalコンパイラは一般的なバグを検出しようとしますが、考えられるすべての理論的なケースを処理せず、何が起こりたいのかを推測しようとします。 –

1

Javaでは、戻り値の型(ブール値)を指定する場合、値が常に同じかどうかにかかわらず、明示的に値を指定する必要があります。それは問題を提起します:それがいつも同じであれば、なぜ何かを返すのですか?あなたはすでに呼び出しコードで答えを知っています。

理由だけで書かないで:あなたの質問の後半部分については

public boolean test() { 
    return true; 
} 

を、コンパイラは、第二の経路は、if文で撮影されることはありませんことを見て、あなたはそれについて警告を与えます。

0

何かをテストすると、値か別の値になる可能性があります。したがって、if文の中に入ることを保証することはできません。

if (someBoolean){ 
    return true; 
} 

someBooleanはtrueまたはfalseのいずれかになります。 メソッドが何かを返す必要がありsomeBooleanがfalseの場合、何も返されません。 したがって、この場合には、あなたが行うことができます:偽

if (someBoolean){ 
    return true; 
} 

リターンを。

または単に

return someBoolean; 
関連する問題