0

The following code works fine:

String connStr = "jdbc:mysql://localhost:3306/addressbook";

try ( Connection conn = DriverManager.getConnection(connStr, "root", "");
    PreparedStatement ps = conn.prepareStatement("select * from contact where firstName=?");
        ) {

    ps.setString(1, "Cippo");
    ResultSet rs = ps.executeQuery();

    while(rs.next()) {
        System.out.print(rs.getString(2) + "\t");
        System.out.print(rs.getString(3) + "\t");
        System.out.print(rs.getInt(1) + "\t");
        System.out.print(rs.getString(4) + "\t");
        System.out.println(rs.getString(5));                    
    }

} catch (SQLException e) {
    e.printStackTrace();
    System.exit(-1);
}

But for a mysterious reason when I move other two instructions into the try-with-resource block (where they are supposed to stay), I get a compilation error:

String connStr = "jdbc:mysql://localhost:3306/addressbook";

try ( Connection conn = DriverManager.getConnection(connStr, "root", "");
    PreparedStatement ps = conn.prepareStatement("select * from contact where firstName=?");
        ps.setString(1, "Cippo");
        ResultSet rs = ps.executeQuery();
        ) { 

    while(rs.next()) {
        System.out.print(rs.getString(2) + "\t");
        System.out.print(rs.getString(3) + "\t");
        System.out.print(rs.getInt(1) + "\t");
        System.out.print(rs.getString(4) + "\t");
        System.out.println(rs.getString(5));                    
    }

} catch (SQLException e) {
    e.printStackTrace();
    System.exit(-1);
}

The compilation error is irreasonable: "ps cannot be resolved". But conn is resolved without any problem. Why that?

4

3 に答える 3

0

それがJava構文の定義方法です。

Java 言語仕様の セクション 14.20.3 の try-with-resources から

try-with-resources ステートメントは、try ブロックの実行前に初期化され、try ブロックの実行後に初期化とは逆の順序で自動的に閉じられる変数 (リソースと呼ばれる) でパラメーター化されます。[...]

ResourceSpecificationは、try ステートメントのリソースとして機能する初期化式を使用して 1 つ以上のローカル変数を宣言します。

于 2013-06-20T21:15:07.803 に答える
0

AutoCloseable http://docs.oracle.com/javase/7/docs/api/java/lang/Au ​​toCloseable.htmlは、内部例外をキャッチする前に閉じられます。そのため、AutoCloeable を try-resource ブロック内および try ブロック内に配置することはできません。

于 2013-06-20T21:16:06.987 に答える
0

try with resources 構文は、ストリームやデータベース接続などのautocloseableを実装するオブジェクトを割り当てて、例外が発生した場合に正しくクリーンアップできるようにするためのものです。任意の追加コードを実行するようには設計されていません。

最初の例で同じ結果が得られたので、try ステートメントの割り当てセクション内にこれら 2 つの命令を配置することで、何を達成しようとしていたのか、実際にはわかりません。

ResultSet更新:失敗時に自動的に閉じられるように、を try に入れているかどうか疑問に思います。その場合は、ステートメント オブジェクトの close の呼び出しによって自動的に閉じられるべきだと思います。懸念がある場合は、リソースを使用して別の内部試行でResultSet十分です。

于 2013-06-20T21:13:39.370 に答える