3

最後のステートメントreturnは非 void 戻り値のメソッドにある必要がありますか? しかし、これはまだ機能しています。

public String test()
{
    try
    {
        // Do my work
        return "myValue";
    }
    finally
    {
        System.out.println("I'm in Finally");
    }
}

これがどのように機能するかを理解するための知識が少し不足しています。誰か説明してくれませんか。

4

4 に答える 4

5

このコードを通る可能性のあるすべてのパスは必然的にreturnステートメント*につながるため、このコードに問題はありません。論理的に最後のステートメントである限り、テキスト的に最後のステートメントである必要はありません (Java コンパイラは、そうであるかどうかを判断するのに十分なほどスマートであり、コードを介してパスが返されない場合はエラーを返します)。値または例外をスローします)。return(つまり、ブロック)をヒットした後にコードが実行されるという事実は、finally何も変更しません。コンパイラに関する限り、関数は関数を終了する前に戻り値を提供しています。

*実際、関数のコードを通るパスは 1 つしかなく、returnステートメントで終了します。

于 2012-12-20T17:05:55.333 に答える
2

Java では、考えられるすべてのコード パスが値を返すか、例外をスローすることを確認するだけで十分です。たとえば、次のコードは有効です。

public boolean test() {
    if (3 < 5) {
        return true;
    } else {
        throw new RuntimeException("Holy crap!");
    }
}

あなたの例では、ブロックは return で終了するため、ハッピー パスがカバーされ、 ;tryを超えるコードは必要ありません。finallyさらに、 でスローされた例外tryはメソッドの外に伝播し、メソッドの最後に到達する機会がないため、考えられるすべてのパスがfinallyブロックの下のセクションにヒットすることはなく、return ステートメントは必要ありません。return(実際、末尾にステートメントを追加すると、コンパイラは到達不能コードに関する警告またはエラーを表示する場合があります!)

コードが/ /ブロックcatchを超えて流れる可能性があるため、句を追加すると状況が変わります。trycatchfinally

public String test(){
    try{

        // Do my work

        return "myValue";

    }
    catch (Exception ex) {
        System.out.println("O noes something went wrong");
        // swallow exception
    }
    finally {
        System.out.println("I'm in Finally");
    }

    // Oh no! If an exception was caught, code can actually flow through here.
    // Compiler will complain about a missing return statement until you add one.
    // return "someOtherValue";
}
于 2012-12-20T17:08:55.200 に答える
1

この場合tryfinally常に実行します。したがって、 がどこにあるかは問題ではありませんreturn

public String myfun(){
    return "here";
}

or 

public String myfun(){
    try{
         return "here";
    }finally{
         //will execute always
    }
}

ほぼ同じです。すると、プログラムの流れが見えてきます。しかし、次のような条件がある場合

 public String myfun(){
      if(x==1){
           return "here";
      }
      else{
           // something here 
      }
 }

この場合、エラーが発生します。したがって、ブロックのいずれかが実行されるわけではなく、両方が実行されます。と同じ

public String fun(){
     try{
          return "here";
     }
     catch(Exception e){
          //catch implementation without return
     }
}
于 2012-12-20T17:09:06.760 に答える
1

このための重要な JLS コンセプトは、 try-finallyの動作と組み合わせたステートメントの通常および突然の完了です

「myValue」が返されるため、try ブロックは突然完了します。finally ブロックは正常に完了するため、try ブロックと同じ原因で "myValue" が返されるため、try ステートメント全体が突然完了します。

実際には、メソッドの最後のステートメントである try ステートメントは、文字列を返すステートメントです。

于 2012-12-20T17:22:51.850 に答える