本文概述
在Java中, try-with-resources语句是一个try语句, 用于声明一个或多个资源。资源是一个对象, 在完成程序后必须将其关闭。 try-with-resources语句可确保在语句执行结束时关闭每个资源。
你可以传递实现java.lang.AutoCloseable的任何对象, 其中包括实现java.io.Closeable的所有对象。
以下示例将字符串写入文件。它使用FileOutputStream的实例将数据写入文件。 FileOutputStream是一种资源, 程序完成后必须将其关闭。因此, 在此示例中, 资源关闭是由try本身完成的。
资源尝试示例1
import java.io.FileOutputStream;
public class TryWithResources {
public static void main(String args[]){
// Using try-with-resources
try(FileOutputStream fileOutputStream =newFileOutputStream("/java7-new-features/src/abc.txt")){
String msg = "Welcome to srcmini!";
byte byteArray[] = msg.getBytes(); //converting string into byte array
fileOutputStream.write(byteArray);
System.out.println("Message written to file successfuly!");
}catch(Exception exception){
System.out.println(exception);
}
}
}
输出:
Message written to file successfuly!
文件输出
Welcome to srcmini!
资源尝试示例:使用多个资源
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
public class TryWithResources {
public static void main(String args[]){
// Using try-with-resources
try( // Using multiple resources
FileOutputStream fileOutputStream =new FileOutputStream("/java7-new-features/src/abc.txt");
InputStream input = new FileInputStream("/java7-new-features/src/abc.txt")){
// -----------------------------Code to write data into file--------------------------------------------//
String msg = "Welcome to srcmini!";
byte byteArray[] = msg.getBytes(); // Converting string into byte array
fileOutputStream.write(byteArray); // Writing data into file
System.out.println("------------Data written into file--------------");
System.out.println(msg);
// -----------------------------Code to read data from file---------------------------------------------//
// Creating input stream instance
DataInputStream inst = new DataInputStream(input);
int data = input.available();
// Returns an estimate of the number of bytes that can be read from this input stream.
byte[] byteArray2 = new byte[data]; //
inst.read(byteArray2);
String str = new String(byteArray2); // passing byte array into String constructor
System.out.println("------------Data read from file--------------");
System.out.println(str); // display file data
}catch(Exception exception){
System.out.println(exception);
}
}
}
输出:
------------Data written into file--------------
Welcome to srcmini!
------------Data read from file--------------
Welcome to srcmini!
你可以使用try-with-resources语句使用catch和finally块, 就像普通的try语句一样。
注–在try-with-resources语句中, catch或finally块在声明的资源关闭后执行。
Try-with-resources示例:使用finally块
import java.io.FileOutputStream;
public class TryWithResources {
public static void main(String args[]){
try( FileOutputStream fileOutputStream=
new FileOutputStream("/home/irfan/scala-workspace/java7-new-features/src/abc.txt")){
// -----------------------------Code to write data into file--------------------------------------------//
String msg = "Welcome to srcmini!";
byte byteArray[] = msg.getBytes(); // Converting string into byte array
fileOutputStream.write(byteArray); // Writing data into file
System.out.println("Data written successfully!");
}catch(Exception exception){
System.out.println(exception);
}
finally{
System.out.println("Finally executes after closing of declared resources.");
}
}
}
输出:
Data written successfully!
Finally executes after closing of declared resources.
禁止的异常
如果try块引发异常, 并且try-with-resources引发一个或多个异常, 则try-with-resources引发的异常将被抑制。换句话说, 可以说, 尝试资源引发的异常是被抑制的异常。
你可以使用Throwable类的getSuppress()方法获取这些异常。
Java在Throwable类中添加了一个新的构造函数和两个新方法来处理受抑制的异常。
建设者 | 描述 | |
---|---|---|
protected Throwable(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) | 它使用指定的详细消息, 原因, 启用或禁用抑制以及可写的堆栈跟踪启用或禁用来构造新的throwable。 |
方法 | 描述 | |
---|---|---|
公共最终无效addSuppressed(Throwable异常)/ td> | 它将指定的异常附加到为了传递此异常而被抑制的异常。此方法是线程安全的, 通常由try-with-resources语句(自动和隐式)调用。它引发以下异常:IllegalArgumentException:如果异常是可抛出的, 则throwable无法抑制自身。 NullPointerException:如果exception为null。 | |
public final Throwable[] getSuppressed() | 它返回一个数组, 其中包含被try-with-resources语句抑制的所有异常。如果没有抑制异常或禁用抑制, 则返回一个空数组。 |
评论前必须登录!
注册