Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么不是';在这种情况下,是否可以使用try with resource?_Java_Resources_Try Catch - Fatal编程技术网

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”)
处于无效位置。