JDK7前處理
在jdk1.7之前使用try catch finally 處理流中的異常
格式:
try{
可能會產出異常的代碼
}catch(異常類變量 變量名){
異常的處理邏輯
}finally{
一定會指定的代碼
資源釋放
}
代碼舉例
public class Demo01TryCatch {
public static void main(String[] args) {
//提高變量fw的作用域,讓finally可以使用
//變量在定義的時候,可以沒有值,但是使用的時候必須有值
//fw = new FileWriter("09_IOAndProperties\\g.txt",true); 執行失敗,fw沒有值,fw.close會報錯
FileWriter fw = null;
try{
//可能會產出異常的代碼
fw = new FileWriter("w:\\09_IOAndProperties\\g.txt",true);
for (int i = 0; i <10 ; i++) {
fw.write("HelloWorld"+i+"\r\n");
}
}catch(IOException e){
//異常的處理邏輯
System.out.println(e);
}finally {
//一定會指定的代碼
//創建對象失敗了,fw的默認值就是null,null是不能調用方法的,會拋出NullPointerException,需要增加一個判斷,不是null在把資源釋放
if(fw!=null){
try {
//fw.close方法聲明拋出了IOException異常對象,所以我們就的處理這個異常對象,要麼throws,要麼try catch
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
JDK7的新特性
在try的後邊可以增加一個(),在括號中可以定義流對象,那麼這個流對象的作用域就在try中有效,try中的代碼執行完畢,會自動把流對象釋放,不用寫finally。
格式:
try(定義流對象;定義流對象....){
可能會產出異常的代碼
}catch(異常類變量 變量名){
異常的處理邏輯
}
package demo06.trycatch;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
JDK7的新特性
在try的後邊可以增加一個(),在括號中可以定義流對象
那麼這個流對象的作用域就在try中有效
try中的代碼執行完畢,會自動把流對象釋放,不用寫finally
格式:
try(定義流對象;定義流對象....){
可能會產出異常的代碼
}catch(異常類變量 變量名){
異常的處理邏輯
}
*/
public class Demo02JDK7 {
public static void main(String[] args) {
try (//1.創建一個字節輸入流對象,構造方法中綁定要讀取的數據源
FileInputStream fis = new FileInputStream("c:\\1.jpg");
//2.創建一個字節輸出流對象,構造方法中綁定要寫入的目的地
FileOutputStream fos = new FileOutputStream("d:\\1.jpg");) {
//可能會產出異常的代碼
//一次讀取一個字節寫入一個字節的方式
//3.使用字節輸入流對象中的方法read讀取文件
int len = 0;
while ((len = fis.read()) != -1) {
//4.使用字節輸出流中的方法write,把讀取到的字節寫入到目的地的文件中
fos.write(len);
}
} catch (IOException e) {
//異常的處理邏輯
System.out.println(e);
}
}
}
JDK9新特性
try的前邊可以定義流對象,在try後邊的()中可以直接引入流對象的名稱(變量名),在try代碼執行完畢之後,流對象也可以釋放掉,不用寫finally。
格式:
A a = new A();
B b = new B();
try(a,b){
可能會產出異常的代碼
}catch(異常類變量 變量名){
異常的處理邏輯
}
public class Demo03JDK9 {
public static void main(String[] args) throws IOException {
//1.創建一個字節輸入流對象,構造方法中綁定要讀取的數據源
FileInputStream fis = new FileInputStream("c:\\1.jpg");
//2.創建一個字節輸出流對象,構造方法中綁定要寫入的目的地
FileOutputStream fos = new FileOutputStream("d:\\1.jpg");
try(fis;fos){
//一次讀取一個字節寫入一個字節的方式
//3.使用字節輸入流對象中的方法read讀取文件
int len = 0;
while((len = fis.read())!=-1){
//4.使用字節輸出流中的方法write,把讀取到的字節寫入到目的地的文件中
fos.write(len);
}
}catch (IOException e){
System.out.println(e);
}
//fos.write(1);//Stream Closed
}
}