0
try(PrintWriter f = new PrintWriter(new BufferedWriter(new FileWriter("abc.txt")));) 
{}
catch(IOException ex) 
{
  ex.printStackTrace();
}

以上工作正常。但是当我这样做时

PrintWriter f;
try(f = new PrintWriter(new BufferedWriter(new FileWriter("abc.txt")));) 
{}
catch(IOException ex) 
{
  ex.printStackTrace();
}

它抛出错误。为什么会这样?我正在测试这个新功能,我认为我会采用第二种方法,然后try-catch statement打印资源PrintWriter f- 如果 try-with-resource 语句按预期工作,它应该为空。为什么不允许第二种方式?

另外我如何通过方法1对其进行测试?

4

3 回答 3

4

因为try-with-resources实际上finally为您添加了块以在使用后关闭资源,所以它们无论如何都不应该可用(在您离开try块之后)。

所以这段代码

try(PrintWriter f = new PrintWriter(new BufferedWriter(new FileWriter("abc.txt")));) {

} catch(IOException ex) {
    ex.printStackTrace();
}

实际上转化为

PrintWriter f = null;
try {
    f = new PrintWriter(new BufferedWriter(new FileWriter("abc.txt")));) 
     // now do something
} catch(IOException ex) {
    ex.printStackTrace();
}
finally {
    try {
        f.close();
        catch(IOException ex) {}
     }
}

所以这是最初的目的,把你从臃肿的代码中解救出来,让你只关心try块,把剩下的留在 JVM 上。另请参阅 Oracle文档对此有何评论。

于 2013-10-17T10:12:11.863 回答
1

我相信下面的代码会以意想不到的结果回答您的问题。

    PrintWriter t = null;
    try( PrintWriter f = new PrintWriter( new BufferedWriter(
            new FileWriter( "abc.txt" ) ) ) ) {
        f.println( "bar" );
        t = f;
    } catch( IOException ex ) {
        ex.printStackTrace();
    }
    System.out.println( t );
    t.println( "foo" );
    t.close();

输出:

java.io.PrintWriter@1fc4bec

但是,没有任何内容添加到文件中,因为作者已被尝试关闭。

编辑:如果你想玩 TWR,写一个实现 AutoClosable 的类,例如:

public class Door implements AutoCloseable {
    public Door() {
        System.out.println( "I'm opening" );
    }
    public void close() {
        System.out.println( "I'm closing" );
    }
    public static void main( String[] args ) {
        try( Door door = new Door() ) { }
    }

}

输出:

我开

我要关门了

于 2013-10-17T10:30:20.220 回答
0

不完全确定,但做了一些复杂的猜测:

  • catch 块之后的 f 值可能是未定义的。因此,您必须添加各种检查来验证对象是否已创建、使用和/或关闭。但是,如果您需要所有这些检查,那么首先不使用该习语会更简单。

  • JIT 可以使用块局部变量愉快地优化代码。

  • 在 try 块期间,AutoClosure 变量不得设置为不同的变量,但可以在之后设置。也许这对于 JIT 来说太复杂了,无法检查。

于 2013-10-17T10:19:27.377 回答