0

以下代码工作正常:

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);
}

但是由于一个神秘的原因,当我将其他两条指令移动到 try-with-resource 块(它们应该保留的位置)时,我得到了一个编译错误:

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);
}

编译错误不合理:“ps无法解析”。但是 conn 解决了没有任何问题。为什么?

4

3 回答 3

0

这就是 Java 语法的定义方式:

来自 Java 语言规范,第 14.20.3 节 try-with-resources

try-with-resources 语句使用变量(称为资源)参数化,这些变量在执行 try 块之前被初始化,并在执行 try 块后以与初始化相反的顺序自动关闭。[...]

ResourceSpecification用初始化表达式声明一个或多个局部变量,作为 try 语句的资源。

于 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 语法用于分配实现自动关闭的对象,例如流和数据库连接,以便在发生异常时可以正确清理它们。它不是为执行任意附加代码而设计的。

通过将这两条指令放在 try 语句的分配部分中,我并没有真正看到您想要实现的目标,因为您在第一个示例中获得了相同的结果。

更新:我想知道您是否将其ResultSet放在 try 中,以便在失败时自动关闭。如果是这种情况,那么我认为它应该通过在语句对象上调用 close 来自动关闭。如果您担心使用资源进行单独的内部尝试ResultSet就足够了。

于 2013-06-20T21:13:39.370 回答