2012-05-11 9 views
1

私は以下のコードを持っています。クエリが例外なく実行された場合はtrueを返し、例外がスローされた場合はfalseを返します。最後にステートメントと接続を閉じてください。 私の質問はどこにreturn文を書くべきですか?最後にキャッチしたか?以下のコードでは、クエリが実行された場合tryでtrueを返します。例外がスローされた場合はcatchでfalseです。私の質問は、任意の例外がスローされた場合、falseを返して、接続とステートメントを閉じることですか?Javaのcatch/finallyからの戻り値は?

try { 
      statement = connection.createStatement(); 
      statement.executeQuery("select * from dual"); 
      return true; 
     } catch (SQLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
        return false; 
     } finally{ 
       try { 

         statement.close(); 

         connection.close(); 

       } catch (SQLException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 

       } 

     } 
+0

を試すことができます。あなたのリソースロジックは良くありません。 Java 7を使用している場合は、試用版のリソースを使用することを検討してください。 –

+0

自分で試してみませんか?すべての実行パスに 'System.out.println'ステートメントを入れて自分でデバッグしますか?あなたはそれをよりよく学び、覚えています。 –

答えて

3

あなたが書いたとおりに動作しません。適切finallyブロックとリターンを実行するには、状態を維持する必要がある、すなわち

boolean result = false; 

try 
{ 
// all good 
result = true; 
} 
catch(...) 
{ 
// crap 
result = false; 
} 
finally 
{ 
// close 
} 
return result; 

これは、あなたが実行すると、正しい結果が返されることfinallyブロックには何がしたいことを想定しています。

+0

あなたは何を言っているのかはっきりしませんが、 'try'や' catch'ブロックから 'return'しても' finally'が常に実行されます。 –

+0

@マーク、はい、本当にはっきりしていない、それを修正しました.. – Nim

7

いずれも、その下にあるtry-catchブロックの外側には書き込まないでください。 最終的に返信文を使用しないでください。 return文は常に実行されるため、try-block内の通常のreturn文を踏みとめてください!

5

return文はどこに書きますか?

最終}後、右一番最後にそれを置く:

try { 
     ... 
     return true; 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } finally { 
     ... 
    } 
    return false; // <===== HERE 

機能がtryブロック内のコードが例外をスローせずに実行しtrue場合にのみ返されます。この道を。それ以外の場合は、関数はfalseを返します。

1

さらに、JDK 7を使用して、新しいtryリソースを使用してみてください。

+0

はい、この状況のた​​めのリソースが試されました。 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.htmlを参照してください。 – rajah9

1

あなたは、私はそれがちょうどいいですした場合だと思う

boolean returnVal = false 
try { 
      statement = connection.createStatement(); 
      statement.executeQuery("select * from dual"); 
      returnVal = true; 
    } catch (SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    returnVal = false; 
    } finally{ 
      try { 

        statement.close(); 

        connection.close(); 


      } catch (SQLException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
     returnVal = false; 

      } 
    return returnVal; 

    }