對(duì)于受檢異常在編譯階段必須進(jìn)行預(yù)處理, 預(yù)處理方法有兩種:
● try..catch捕獲處理
● throws拋出處理
語(yǔ)法:
try{
對(duì)可能產(chǎn)生異常的代碼進(jìn)行檢視
try代碼塊中的某條語(yǔ)句一旦產(chǎn)生了異常,程序就立即跳轉(zhuǎn)到catch子句執(zhí)行, try代碼塊后面的代碼不再執(zhí)行
try代碼塊中, 可能會(huì)有多條語(yǔ)句有受檢異常需要預(yù)處理, 可以通過(guò)多個(gè)catch子句分別捕獲
}catch( 異常類型1 e1){
捕獲異常類型1的異常, 捕獲了異常,在開發(fā)階段, 一般的預(yù)處理方式就是把異常打印到屏幕上, 程序員可以根據(jù)異常信息進(jìn)行程序調(diào)試
e1.printStackTrace(); //每個(gè)異常都有這個(gè)方法
}catch( 異常類型2 e2){
如果catch子句捕獲的異常有繼承關(guān)系, 如果想單獨(dú)對(duì)異常進(jìn)行預(yù)處理, 應(yīng)該先捕獲子異常, 再捕獲父異常, 或者直接捕獲一個(gè)父異常
}finally{
finally子句不管是否有異常產(chǎn)生,總是會(huì)執(zhí)行
經(jīng)常在finally子句中釋放系統(tǒng)資源
}
package com.wkcto.chapter02.demo01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* 演示異常的捕獲處理
* 如果沒(méi)有捕獲異常, 系統(tǒng)會(huì)中斷, 對(duì)產(chǎn)生 的異常進(jìn)行捕獲處理后, 程序不會(huì)中斷 ,會(huì)繼續(xù)向下執(zhí)行
* 異常處理的作用:
* 提高程序的健壯性, 魯棒性(Robust)
*
* @author 蛙課網(wǎng)
*
*/
public class Test03 {
public static void main(String[] args) {
try{
FileInputStream fis = new FileInputStream("d:/abc.txt"); //構(gòu)造方法有受檢異常FileNotFoundException需要預(yù)處理
System.out.println("在當(dāng)前程序與指定的文件之間建立了流通道, ");
fis.read(); //read()方法有受檢異常IOException需要預(yù)處理
System.out.println("從文件中讀取了一個(gè)字節(jié)");
fis.close(); //close()方法有受檢異常IOException需要預(yù)處理
System.out.println("文件讀取完后,需要關(guān)閉流通道");
}catch (FileNotFoundException e) {
// 捕獲文件未找到異常
e.printStackTrace(); //開發(fā)時(shí),一般把異常打印到屏幕上
//捕獲了產(chǎn)生的異常, 程序沒(méi)有中斷, 還繼續(xù)向下執(zhí)行
}catch (IOException e) {
// 捕獲IOException異常
// FileNotFoundException 繼承了 IOException, 如果需要單獨(dú)處理, 應(yīng)該先捕獲子異常 ,再捕獲父異常
// 或者, 不需要單獨(dú)處理時(shí), 直接捕獲父異常即可
}
System.out.println("main...end....");
}
}
finally子句總是會(huì)執(zhí)行
package com.wkcto.chapter02.demo01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* finally子句
* 不管是否產(chǎn)生異常, finally子句總是會(huì)執(zhí)行, 經(jīng)常用來(lái)釋放系統(tǒng)資源
* @author 蛙課網(wǎng)
*
*/
public class Test04 {
public static void main(String[] args) {
FileInputStream fis = null;
try{ //try代碼塊,對(duì)可能產(chǎn)生異常的代碼進(jìn)行檢視
fis = new FileInputStream("d:/abc.txt"); //構(gòu)造方法有受檢異常FileNotFoundException需要預(yù)處理
System.out.println("在當(dāng)前程序與指定的文件之間建立了流通道, ");
fis.read(); //read()方法有受檢異常IOException需要預(yù)處理
System.out.println("從文件中讀取了一個(gè)字節(jié)");
// 通過(guò)catch子句捕獲產(chǎn)生的異常
}catch (FileNotFoundException e) {
// 捕獲文件未找到異常
e.printStackTrace(); //開發(fā)時(shí),一般把異常打印到屏幕上
//捕獲了產(chǎn)生的異常, 程序沒(méi)有中斷, 還繼續(xù)向下執(zhí)行
}catch (IOException e) {
// 捕獲IOException異常
// FileNotFoundException 繼承了 IOException, 如果需要單獨(dú)處理, 應(yīng)該先捕獲子異常 ,再捕獲父異常
// 或者, 不需要單獨(dú)處理時(shí), 直接捕獲父異常即可
}finally {
System.out.println("finally子句,不管是否產(chǎn)生異常,總是會(huì)執(zhí)行, 經(jīng)常在finally子句中釋放系統(tǒng)資源");
//可以在finally子句中關(guān)閉流通道
if ( fis != null ) {
try {
fis.close(); //close()方法有受檢異常IOException需要預(yù)處理
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("文件讀取完后,需要關(guān)閉流通道");
}
}
System.out.println("main...end....");
}
}
package com.wkcto.chapter02.demo01;
/**
* finally總是會(huì)執(zhí)行
* 1)try/catch/finally子句都不能單獨(dú)使用, 可以try..catch.., 也可以try...finally, 也可以try...catch..finally
* 2)final/finalize/finally的區(qū)別
* @author 蛙課網(wǎng)
*
*/
public class Test05 {
public static void main(String[] args) {
int num = mm(10);
System.out.println( num ); //10
}
public static int mm( int xx ) { //xx = 10
try {
return xx;
} finally {
xx++;
}
/*
* 程序執(zhí)行到return xx;語(yǔ)句時(shí), 并沒(méi)有立即執(zhí)行return語(yǔ)句, 而是把xx變量的值保存起來(lái)
* 然后執(zhí)行finally子句, xx的值加1變?yōu)榱?11
* 最后再執(zhí)行return語(yǔ)句, 返回的不是xx變量現(xiàn)在的值, 而保存的值10給返回了
*/
}
}
throws拋出處理
package com.wkcto.chapter02.demo01;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* throws拋出處理
* @author 蛙課網(wǎng)
*
*/
public class Test06 {
//在定義main()方法時(shí),可以拋出異常, main的異常拋出給JVM
//JVM默認(rèn)的處理方式: 中斷程序, 打印異常信息
// public static void main(String[] args) throws FileNotFoundException {
public static void main(String[] args) {
System.out.println("main方法中調(diào)用m1()方法");
try {
m1(); //拋出m1()拋出的異常, 這個(gè)異常不會(huì)繼續(xù)上拋了, 程序也不會(huì)中斷,繼續(xù)向下執(zhí)行
} catch (FileNotFoundException e) {
e.printStackTrace();
}
System.out.println("main方法結(jié)束....");
}
//如果m1()方法 在定義時(shí)通過(guò)throws聲明了一個(gè)異常, 就是受檢異常, 在調(diào)用m1()方法時(shí)也需要對(duì)該異常進(jìn)行預(yù)處理
//誰(shuí)調(diào)用m1()方法, 誰(shuí)負(fù)責(zé)處理該異常
private static void m1() throws FileNotFoundException {
System.out.println("m1方法開始執(zhí)行, 調(diào)用了m2()方法 ");
m2(); //在調(diào)用m2()方法, 需要對(duì)m2()的受檢異常進(jìn)行預(yù)處理
System.out.println("m1方法結(jié)束 ......");
}
//在定義方法時(shí), 如果方法體中的某條語(yǔ)句有受檢異常需要預(yù)處理, 可以捕獲處理, 還可以拋出處理
//在方法的定義位置通過(guò)throws關(guān)鍵字聲明拋出異常, 在m2()定義時(shí)通過(guò)throws聲明的異常 就是受檢異常
//誰(shuí)調(diào)用m2()方法, 誰(shuí)負(fù)責(zé)處理該異常
private static void m2() throws FileNotFoundException {
System.out.println("m2方法調(diào)用 FileInputStream類的構(gòu)造方法");
FileInputStream fis = new FileInputStream("d:/abc.txt"); //構(gòu)造方法有受檢異常需要預(yù)處理
System.out.println("m2.結(jié)束");
}
}
異常處理可以進(jìn)行捕獲,也可以拋出, 如何選擇?
● 在定義方法時(shí), 如果方法體中某條語(yǔ)句有受檢異常需要預(yù)處理, 可以選擇捕獲處理,也可以選擇拋出處理。
● 在調(diào)用方法時(shí), 如果被調(diào)用的方法有受檢異常需要預(yù)處理, 一般情況下是進(jìn)行捕獲處理。
● 定義方法時(shí),拋出的異常,是拋出給調(diào)用者, 通過(guò)拋出異常,提醒方法的調(diào)用者,可能有異常發(fā)生, 調(diào)用者需要對(duì)這個(gè)異常進(jìn)行預(yù)處理
● 在定義方法時(shí), 如果方法體中通過(guò)throw語(yǔ)句拋出了一個(gè)異常對(duì)象, 所在的方法應(yīng)該通過(guò)throws聲明該異常