2011-01-31 9 views
3

メソッド/コンストラクタ本体以外にも?Javaでは、return文はどこに表示されますか?

また、コンストラクタによって返されるものがありますか?または、「return;」をそれに続く式なしでのみ使用できますか?

+0

あなたが作業しているのは正確です。あなたは奇妙な "言語法"の質問をしていて、それは私を好奇心にしています:-) – Pointy

+0

私は先日誤解していたので、別の人に答えることに夢中になりません。 :) – biziclop

+0

言語を試してみるだけです。何ができて何が不可能であるかを見る。 :) –

答えて

7

Javaでは、return文はどこに表示されますか?メソッド/コンストラクタ本体の内部に加えて?のみがコンストラクタまたはメソッドに

JLS - http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#6767

returnステートメントが返すメソッドの呼び出し元に制御を(§8.415.12)又はコンストラクタ(§ 8.8、§15.9)


また、コンストラクタによって返すことができるものがありますか?

ませ

JLSない - http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#6767

が値を返すように宣言されていること方法宣言に含まれている必要があり、式を持つreturn文(8.4)またはコンパイル時エラーが発生します。


それとも私だけ使用することができます "を返します。"それに続く式は一切ありませんか?

はい

JLS - http://java.sun.com/docs/books/jls/second_edition/html/statements.doc.html#6767

ノー式でreturn文がないように、voidキーワードを使用して、宣言されたメソッドの本体でを含まれている必要があります任意の値(§8.4)、またはコンストラクタの本体(§8.8)

+1

偉大な、構造化された、答え、必要に応じて強調。驚くばかり。 –

+0

@ジョン - フィードバックありがとうございます。それ以上の努力をする。 –

0

戻り値の型がvoidのメソッドでは、値を指定しないreturnを使用できます。他の方法では、これは不可能である。

コンストラクタを定義・ノーリターンタイプを持っていないので、コンストラクタは、その本体内でreturn文を持つべきではない

public void test(String s) { 
     if (s.equals("")) { 
      return; 
     } 
    } 

例えば。

EDIT:Jon Skeetが指摘したように、コンストラクタは値のないreturn文を持つことができますが、ほとんどの場合、これは使用されません。

+0

コンストラクターでreturnステートメントを問題なく使用できます。比較的早い段階では、このようなことはまったく妥当です。 –

+0

だからこそ、コンストラクターはリターンステートメントを一般的に持つべきではありませんが、そうすることができます;) –

+0

しかし、私は自分の答えを編集しました。ありがとう! –

4

returnステートメントは、メソッドまたはコンストラクタのどこにでも表示できます。

戻り値はメソッドの戻り値の型と互換性があります。メソッドがvoidの場合、戻り値は何も返しません。

コンストラクタには戻り値の型が全くありません。したがって、return文をコンストラクタに書き込む場合は、それに続けて値を指定しないでください。

0

私はreturn文がどこで使われるかについて正確には分かりません。これらは、値を返すメソッド内で(または戻り値のないメソッドを終了するために)最も一般的に使用されます。

コンストラクターは値を返すことはできません。コンストラクタを呼び出すと、VMは作成するオブジェクトのサイズに応じてメモリを割り当て、オブジェクト内の適切なコンストラクタを呼び出します。これはメソッドを呼び出すプロセスとは異なるプロセスです。 return文を使用できるかもしれませんが、コンストラクタ自体から値を返すことはできません。

コンストラクタから情報を返す(より適切には、構築中に何かが間違っていることを示す)ために、代わりに例外を使用することができます。

5

これと他の多くの言語の弁護士の質問のための真実のソースはこの場合section 14.17には、Java Language Specification次のとおりです。

return文戻っは、§8.4(メソッドの呼び出し元に制御を15.12 )またはコンストラクタ(§8.8、§15.9)。

ReturnStatement:
   リターン式オプト

Expressionを持たないreturn文は、宣言されたメソッドの本体に含まれていなければなりません。voidを使用して値を返しません(8.4)か、コンストラクタの本体(8.8)にあります。コンパイル時エラーは、インスタンス初期化子または静的初期化子(8.7)内にreturn文がある場合に発生します。 Expressionを持たないreturn文は、それを含むメソッドまたはコンストラクタの呼び出し側に制御を移そうとします。

正確に言えば、式を持たないreturn文は常に値が返されるため、突然完了します。

これは明示的コンストラクタでreturn文を使用できることを呼び出すことに注意してください - それはは、コンストラクタとメソッドに制限はありません。

+0

JLSは実際に相談すべき最初の場所です。 +1 –

+1

興味深いのは、 'return'が突然終了するので、' finally'ブロックに 'return'を置くと、スローされた例外や対応する' try'ブロックから返された値はトレースなしで消えます。 – biziclop

+0

@biziclop:興味深いのは、例外を「取り除く」ための素早い方法のようです。それを試してみる必要があります。 –

0

私はメソッド内にreturn文を1つしか持たず、コンストラクタ内にreturn文を置かない方が好きです。あなたがこのベストプラクティスから抜け出そうとしているものと比較して、もう1つレベルのインデントが受け入れられることはしばしばあります。コードを読みやすくすることがよくあります。最後に返される値のローカル変数がある場合、その変数をfinalとして宣言する可能性があります。そのため、変数が一度正しく割り当てられることを絶対に確信できます。多くの場合、アルゴリズムの実際の複雑さを理解することができます。しかし、私はメソッド内でいくつかのスロー文を使用しています。また、私は、メソッドの最初にチェックされ、javadocに記述されている事前条件付きのDesign by Contractを使用することをお勧めします。