Java 为什么不是';在这种情况下,是否可以使用try with resource?
以下代码可以正常工作:Java 为什么不是';在这种情况下,是否可以使用try with resource?,java,resources,try-catch,Java,Resources,Try Catch,以下代码可以正常工作: String connStr = "jdbc:mysql://localhost:3306/addressbook"; try ( Connection conn = DriverManager.getConnection(connStr, "root", ""); PreparedStatement ps = conn.prepareStatement("select * from contact where firstName=?"); )
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无法解决”。但是康恩没有任何问题。为什么会这样?try with resources语法用于分配实现流和数据库连接的对象,以便在发生异常时正确清理它们。它不是为执行任意附加代码而设计的 我真的看不出您试图通过将这两条指令放在try语句的分配部分来实现什么,因为您已经获得了与第一个示例相同的结果
更新:我想知道您是否将
ResultSet
放在try中,以便在失败时自动关闭。如果是这种情况,那么我认为应该通过调用语句对象上的close来自动关闭它。如果您对ResultSet
的资源进行单独的内部尝试就足够了。Java语法就是这样定义的:
从
try with resources语句是用变量(已知)参数化的
作为资源),在执行try块之前初始化
并自动关闭,顺序与关闭顺序相反
在执行try块后初始化。
[……]
ResourceSpecification使用声明一个或多个局部变量
初始值设定项表达式用作try语句的资源
自动关闭在捕获任何内部异常之前关闭。因此,不可能在try资源块和try块中放置autocloable。我认为除了在
try(…)
部分中的赋值操作之外,您无法执行任何操作,但我不确定。因此,您的代码片段:ps.setString(1,“Cippo”)
处于无效位置。