異常:
現(xiàn)實(shí)生活的病
現(xiàn)實(shí)生活中萬(wàn)物在發(fā)展和變化會(huì)出現(xiàn)各種各樣不正常的現(xiàn)象横殴。
1:例如:人的成長(zhǎng)過(guò)程中會(huì)生病被因。
|——病
|——不可治愈(癌癥晚期)
|——可治愈
|——小病自行解決(上火,牙痛)
|——去醫(yī)院(感冒,發(fā)燒)
現(xiàn)實(shí)生活中的很多病況從面向?qū)ο蟮慕嵌瓤紤]也是一類事物,可以定義為類衫仑。
java中可以通過(guò)類對(duì)這一類不正常的現(xiàn)象進(jìn)行描述梨与,并封裝為對(duì)象。
java的異常體系包含在java.lang這個(gè)包默認(rèn)不需要導(dǎo)入文狱。
java異常體系
|——Throwable (實(shí)現(xiàn)類描述java的錯(cuò)誤和異常)
|——Error (錯(cuò)誤)一般不通過(guò)代碼去處理粥鞋。
|——Exceprion (異常)
|——RuntimeException (運(yùn)行時(shí)異常)
|——非運(yùn)行時(shí)異常
常見(jiàn)的Error;
/*
java虛擬機(jī)默認(rèn)管理了64M的內(nèi)存瞄崇,一數(shù)組需要1G的內(nèi)存呻粹,這樣子就會(huì)造成內(nèi)存溢出
byte[] but = new byte[1024*1024*1024] //1K-->1M-->1G
System.out.println(buf);
*/
它指的是一個(gè)合理的應(yīng)用程序不能截獲的嚴(yán)重的問(wèn)題。大多數(shù)都是反常的情況等浊。錯(cuò)誤是JVM的一個(gè)故障(雖然它可以是任何系統(tǒng)級(jí)的服務(wù))腮郊。所以,錯(cuò)誤是很難處理的筹燕,一般的開(kāi)發(fā)人員(當(dāng)然不是你)是無(wú)法處理這些錯(cuò)誤的轧飞。比如內(nèi)存溢出.
異常體系圖的對(duì)應(yīng)
class ExceptionDemo1{
public static div(int a, int b){
int c = a/b;
System.out.printlin("----" + c);
}
public static void main(String args[]){
ExceptionDemo1 demo1 = ExceptionDemo1();
demo1.div(4,0);
}
}
Throwable類
*toString() 輸出該異常的類名。
getMessage() 輸出異常的信息撒踪,需要通過(guò)構(gòu)造方法傳入異常信息(例如病態(tài)信息)过咬。
printStackTrace() 打印棧信息。
人生部诽巍:流鼻涕援奢,感冒,呼吸道感染忍捡,肺炎集漾。。砸脊。最后體現(xiàn)的是肺炎具篇。
醫(yī)生要處理需要獲知這些信息。從外到里處理凌埂。最后找病源
class Demo6 {
public static void main(String[] args) {
// Throwable able=newThrowable();
Throwable able = new Throwable("想吐驱显。。瞳抓。");
System.out.println(able.toString()); // 輸出該異常的類名
System.out.println(able.getMessage()); // 輸出異常的信息
able.printStackTrace(); // 打印棧信息
}
}
程序中的異常處理
當(dāng)除數(shù)是非0埃疫,除法運(yùn)算完畢,程序繼續(xù)執(zhí)行孩哑。
當(dāng)除數(shù)是0栓霜,程序發(fā)生異常,并且除法運(yùn)算之后的代碼停止運(yùn)行横蜒。因?yàn)槌绦虬l(fā)生異常需要進(jìn)行處理胳蛮。
class Demo7 {
public static void main(String[] args) {
div(2, 0);
System.out.println("over");
}
public static void div(int x, int y) {
//該行代碼的y值可能是0,程序會(huì)出現(xiàn)異常并停止
System.out.println(x / y);
System.out.println("除法運(yùn)算");
}
}
//ArithmeticException
疑問(wèn): 出現(xiàn)異常如何處理?
自行處理
try{//可能發(fā)生異常的代碼 }catch(異常類 變量名){//處理}丛晌。
案例除法運(yùn)算的異常處理仅炊。
如果沒(méi)有進(jìn)行try catch處理,出現(xiàn)異常程序就停止澎蛛。進(jìn)行處理后抚垄,程序會(huì)繼續(xù)執(zhí)行。
多個(gè)異常
案例print方法,形參中增加數(shù)組督勺。
在print方法中操作數(shù)組會(huì)發(fā)生新的異常
ArrayIndexOutOfBoundsException渠羞,NullPointerException),如何處理智哀?
使用將可能發(fā)生異常的代碼放入try語(yǔ)句中次询,添加多個(gè)catch語(yǔ)句即可。
可以處理多種異常瓷叫,但是同時(shí)只能處理一種異常屯吊。
try中除0異常和數(shù)組角標(biāo)越界同時(shí)出現(xiàn),只會(huì)處理一種摹菠。
public class Demo8 {
public static void main(String[] args) {
System.out.println();
int[] arr = { 1, 2 };
arr = null;
// print (1, 0, arr);
print (1, 2, arr);
System.out.println("over");
}
public static void print(int x,int y, int[] arr) {
try{
System.out.println(arr[1]);
System.out.println(x / y);
} catch (ArithmeticException e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("算術(shù)異常盒卸。。次氨。");
} catch (ArrayIndexOutOfBoundsException e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("數(shù)組角標(biāo)越界蔽介。。煮寡。");
} catch (NullPointerException e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("空指針異常虹蓄。。幸撕。");
}
System.out.println("函數(shù)執(zhí)行完畢");
}
}
總結(jié)
**程序中有多個(gè)語(yǔ)句可能發(fā)生異常薇组,可以都放在try語(yǔ)句中。并匹配對(duì)個(gè)catch語(yǔ)句處理坐儿。
如果異常被catch匹配上律胀,接著執(zhí)行try{}catch(){} 后的語(yǔ)句。沒(méi)有匹配上程序停止貌矿。
try中多個(gè)異常同時(shí)出現(xiàn)炭菌,只會(huì)處理第一條出現(xiàn)異常的一句,剩余的異常不再處理逛漫。
使用多態(tài)機(jī)制處理異常娃兽。
程序中多態(tài)語(yǔ)句出現(xiàn)不同異常,出現(xiàn)了多個(gè)catch語(yǔ)句尽楔。簡(jiǎn)化處理(相當(dāng)于急診)。
使用多態(tài)第练,使用這些異常的父類進(jìn)行接收阔馋。(父類引用接收子類對(duì)象)
**
public static void div(int x, int y, int[] arr, Father f) {
try {
System.out.println(arr[1]); // 數(shù)組越界
System.out.println(x / y); // 除零
Son s = (Son) f; // 類型轉(zhuǎn)換
} catch (Exception e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("出錯(cuò)啦");
}
System.out.println("函數(shù)執(zhí)行完畢");
}
多個(gè)catch語(yǔ)句之間的執(zhí)行順序。
是進(jìn)行順序執(zhí)行娇掏,從上到下呕寝。
如果多個(gè)catch 內(nèi)的異常有子父類關(guān)系。
子類異常在上婴梧,父類在最下下梢。編譯通過(guò)運(yùn)行沒(méi)有問(wèn)題
父類異常在上客蹋,子類在下,編譯不通過(guò)孽江。(因?yàn)楦割惪梢詫⒆宇惖漠惓L幚硌扰鳎宇惖腸atch處理不到)。
多個(gè)異常要按照子類和父類順序進(jìn)行catch
class Father {
}
class Son extends Father {
}
public class Demo8 {
public static void main(String[] args) {
System.out.println();
int[] arr = { 1, 2 };
arr = null;
Father f = new Father();
div(1, 0, arr, f);
System.out.println("over");
}
public static void div(int x, int y, int[] arr, Father f) {
try {
System.out.println(arr[1]);
System.out.println(x / y);
Son s = (Son) f;
} catch (ArithmeticException e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("算術(shù)異常岗屏。辆琅。。");
} catch (ArrayIndexOutOfBoundsException e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("數(shù)組角標(biāo)越界这刷。婉烟。。");
} catch (NullPointerException e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("空指針異常暇屋。似袁。。");
} catch (Exception e) {
e.toString();
e.getMessage();
e.printStackTrace();
System.out.println("出錯(cuò)啦");
}
System.out.println("函數(shù)執(zhí)行完畢");
}
}
總結(jié)
*處理異常應(yīng)該catch異常具體的子類咐刨,可以處理的更具體昙衅,不要為了簡(jiǎn)化代碼使用異常的父類。
疑惑:感覺(jué)異常沒(méi)有作用.
拋出處理
定義一個(gè)功能所宰,進(jìn)行除法運(yùn)算例如(div(int x,int y))如果除數(shù)為0绒尊,進(jìn)行處理蛙奖。
功能內(nèi)部不想處理册倒,或者處理不了。就拋出使用throw new Exception("除數(shù)不能為0"); 進(jìn)行拋出寂诱。拋出后需要在函數(shù)上進(jìn)行聲明躯泰,告知調(diào)用函數(shù)者谭羔,我有異常,你需要處理如果函數(shù)上不進(jìn)行throws 聲明麦向,編譯會(huì)報(bào)錯(cuò)瘟裸。例如:未報(bào)告的異常 java.lang.Exception;必須對(duì)其進(jìn)行捕捉或聲明以便拋出throw new Exception("除數(shù)不能為0");
public static void div(int x, int y) throws Exception { // 聲明異常诵竭,通知方法調(diào)用者话告。
if (y == 0) {
throw new Exception("除數(shù)為0"); // throw關(guān)鍵字后面接受的是具體的異常的對(duì)象
}
System.out.println(x / y);
System.out.println("除法運(yùn)算");
}
main方法中調(diào)用除法功能
調(diào)用到了一個(gè)可能會(huì)出現(xiàn)異常的函數(shù),需要進(jìn)行處理卵慰。
1:如果調(diào)用者沒(méi)有處理會(huì)編譯失敗沙郭。
如何處理聲明了異常的函數(shù)。
- try{}catch(){}
public static void main(String[] args) {
try {
div(2, 0);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("over");
}
public static void div(int x, int y) throws Exception { // 聲明異常裳朋,通知方法調(diào)用者病线。
if (y == 0) {
throw new Exception("除數(shù)為0"); // throw關(guān)鍵字后面接受的是具體的異常的對(duì)象
}
System.out.println(x / y);
System.out.println("除法運(yùn)算");
}
}
2:繼續(xù)拋出throws
class Demo9 {
public static void main(String[] args) throws Exception {
div(2, 0);
System.out.println("over");
}
public static void div(int x, int y) throws Exception { // 聲明異常,通知方法調(diào)用者。
if (y == 0) {
throw new Exception("除數(shù)為0"); // throw關(guān)鍵字后面接受的是具體的異常的對(duì)象
}
System.out.println(x / y);
System.out.println("除法運(yùn)算");
}
}
throw和throws的區(qū)別
相同:都是用于做異常的拋出處理的送挑。
不同點(diǎn):
//throws 處理
public static void main(String[] args) throws InterruptedException {
Object obj = new Object();
obj.wait();
}
public static void main(String[] args) {
//try catch 處理
Object obj = new Object();
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
**使用的位置: throws 使用在函數(shù)上绑莺,throw使用在函數(shù)內(nèi)
后面接受的內(nèi)容的個(gè)數(shù)不同:
throws 后跟的是異常類,可以跟多個(gè)惕耕,用逗號(hào)隔開(kāi)纺裁。
throw 后跟異常對(duì)象。
**
總結(jié)
- try語(yǔ)句不能單獨(dú)存在赡突,可以和catch对扶、finally組成 try...catch...finally、try...catch惭缰、try...finally三種結(jié)構(gòu)浪南。
- catch語(yǔ)句可以有一個(gè)或多個(gè),finally語(yǔ)句最多一個(gè)漱受,try络凿、catch、finally這三個(gè)關(guān)鍵字均不能單獨(dú)使用昂羡。
- try絮记、catch、finally三個(gè)代碼塊中變量的作用域分別獨(dú)立而不能相互訪問(wèn)虐先。如果要在三個(gè)塊中都可以訪問(wèn)怨愤,則需要將變量定義到這些塊的外面。
- 多個(gè)catch塊時(shí)候蛹批,Java虛擬機(jī)會(huì)匹配其中一個(gè)異常類或其子類撰洗,就執(zhí)行這個(gè)catch塊,而不會(huì)再執(zhí)行別的catch塊腐芍。(子類在上差导,父類在下)。
- throw語(yǔ)句后不允許有緊跟其他語(yǔ)句猪勇,因?yàn)檫@些沒(méi)有機(jī)會(huì)執(zhí)行设褐。
- 如果一個(gè)方法調(diào)用了另外一個(gè)聲明拋出異常的方法,那么這個(gè)方法要么處理異常泣刹,要么聲明拋出助析。
自定義異常
問(wèn)題:現(xiàn)實(shí)中會(huì)出現(xiàn)新的病,就需要新的描述椅您。
分析: java的面向?qū)ο笏枷雽⒊绦蛑谐霈F(xiàn)的特有問(wèn)題進(jìn)行封裝外冀。
案例: 定義功能模擬凌波登錄。(例如:lb(String ip))需要接收ip地址
當(dāng)沒(méi)有ip地址時(shí)襟沮,需要進(jìn)行異常處理。
- 當(dāng)ip地址為null是需要throw new Exception("無(wú)法獲取ip");
- 但Exception是個(gè)上層父類,這里應(yīng)該拋出更具體的子類开伏。
/*
自定義異常
*/
class NoIpException extends Exception {
NoIpException() {
}
NoIpException(String message) {
super(message);
}
}
class Demo10 {
public static void main(String[] args) throws NoIpException {
System.out.println();
String ip = "192.168.10.252";
ip = null;
try {
Lb(ip);
} catch (NoIpException e) {
System.out.println("程序結(jié)束");
}
}
public static void Lb(String ip) throws NoIpException {
if (ip == null) {
// throw new Exception("沒(méi)插網(wǎng)線吧膀跌,小白");
throw new NoIpException("沒(méi)插網(wǎng)線吧,小白");
}
System.out.println("醒醒了固灵,Jarret.Yang開(kāi)始上課了捅伤。");
}
- 可以自定義異常
自定義描述沒(méi)有IP地址的異常(NoIpException)。
- 和sun的異常體系產(chǎn)生關(guān)系巫玻。繼承Exception類丛忆,自定義異常類名也要規(guī)范,結(jié)尾加上Exception,便于閱讀
*案例:模擬吃飯沒(méi)帶錢(qián)的問(wèn)題
定義吃飯功能仍秤,需要錢(qián)熄诡。(例如:eat(double money))
如果錢(qián)不夠是不能吃放,有異常诗力。
自定義NoMoneyException();繼承Exception 提供有參無(wú)參構(gòu)造凰浮,調(diào)用父類有參構(gòu)造初始化。at 方法進(jìn)行判斷苇本,小于10塊袜茧,throw NoMoneyException("錢(qián)不夠");
eat 方法進(jìn)行聲明,throws NoMoneyException
如果錢(qián)不夠老板要處理瓣窄。調(diào)用者進(jìn)行處理笛厦。try{}catch(){} 。
class NoMoneyException extends Exception {
NoMoneyException() {
}
NoMoneyException(String message) {
super(message);
}
}
class Demo11 {
public static void main(String[] args) {
System.out.println();
try {
eat(0);
} catch (NoMoneyException e) {
System.out.println("跟我干活吧俺夕。");
}
}
public static void eat(double money) throws NoMoneyException {
if (money < 10) {
throw new NoMoneyException("錢(qián)不夠");
}
System.out.println("吃桂林米粉");
}
}
運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常
RuntimeException
RunntimeException的子類:
ClassCastException
多態(tài)中裳凸,可以使用Instanceof 判斷,進(jìn)行規(guī)避ArithmeticException
進(jìn)行if判斷啥么,如果除數(shù)為0登舞,進(jìn)行returnNullPointerException
進(jìn)行if判斷,是否為nullArrayIndexOutOfBoundsException
使用數(shù)組length屬性悬荣,避免越界這些異常時(shí)可以通過(guò)程序員的良好編程習(xí)慣進(jìn)行避免的
1:遇到運(yùn)行時(shí)異常無(wú)需進(jìn)行處理菠秒,直接找到出現(xiàn)問(wèn)題的代碼,進(jìn)行規(guī)避氯迂。
2:就像人上火一樣牙疼一樣践叠,找到原因,自行解決即可
3:該種異常編譯器不會(huì)檢查程序員是否處理該異常
4:如果是運(yùn)行時(shí)異常嚼蚀,那么沒(méi)有必要在函數(shù)上進(jìn)行聲明禁灼。
案例
1:除法運(yùn)算功能(div(int x,int y))
2:if判斷如果除數(shù)為0,throw new ArithmeticException();
3:函數(shù)聲明throws ArithmeticException
4:main方法調(diào)用div,不進(jìn)行處理
5:編譯通過(guò)轿曙,運(yùn)行正常
6:如果除數(shù)為0弄捕,報(bào)異常僻孝,程序停止。
7:如果是運(yùn)行時(shí)異常守谓,那么沒(méi)有必要在函數(shù)上進(jìn)行聲明穿铆。
Object類中的wait()方法,內(nèi)部throw了2個(gè)異常 IllegalMonitorStateException InterruptedException
1:只聲明了一個(gè)(throws) IllegalMonitorStateException是運(yùn)行是異常沒(méi)有聲明斋荞。
class Demo12 {
public static void main(String[] args){
div(2, 1);
}
public static void div(int x, int y) {
if (y == 0) {
throw new ArithmeticException();
}
System.out.println(x / y);
}
}
非運(yùn)行時(shí)異常(受檢異常)
如果出現(xiàn)了非運(yùn)行時(shí)異常必須進(jìn)行處理throw或者try{}catch(){}處理荞雏,否則編譯器報(bào)錯(cuò)。
1平酿;IOException 使用要導(dǎo)入包import java.io.IOException;
2:ClassNotFoundException
2凤优;例如人食物中毒,必須進(jìn)行處理蜈彼,要去醫(yī)院進(jìn)行處理筑辨。
案例
1:定義一測(cè)試方法拋出并聲明ClassNotFoundException(test())
2:main方法調(diào)用test
3:編譯報(bào)錯(cuò)
- 未報(bào)告的異常 java.lang.ClassNotFoundException;必須對(duì)其進(jìn)行捕捉或聲明以便拋出
public void isFile(String path){
try
{
/*
根據(jù)文件的路徑生成一個(gè)文件對(duì)象柳刮,如果根據(jù)該路徑找不到相應(yīng)的文件挖垛,
則沒(méi)法生成文件對(duì)象。
*/
File file = new File(path);
//讀取文件的輸入流
FileInputStream input = new FileInputStream(file);
//讀取文件
input.read();
}
catch (NullPointerException e)
{
System.out.println("讀取默認(rèn)的文件路徑..");
}
}
4:Sun 的API文檔中的函數(shù)上聲明異常秉颗,那么該異常是非運(yùn)行是異常痢毒,
調(diào)用者必須處理。
5:自定義異常一般情況下聲明為非運(yùn)行時(shí)異常
- 函數(shù)的重寫(xiě)和異常
- 運(yùn)行時(shí)異常
1:案例定義Father類蚕甥,定義功能拋出運(yùn)行是異常哪替,例如(test() throw
ClassCastException)
2:定義Son類,繼承Father類菇怀,定義test方法凭舶,沒(méi)有聲明異常
3:使用多態(tài)創(chuàng)建子類對(duì)象,調(diào)用test方法
4:執(zhí)行子類方法- 函數(shù)發(fā)生了重寫(xiě)爱沟,因?yàn)槭沁\(yùn)行時(shí)異常帅霜,在父類的test方法中,可以聲明throws 也可以不聲明throws
- 運(yùn)行時(shí)異常
class Father {
void test() throws ClassCastException { // 運(yùn)行時(shí)異常
System.out.println("父類");
throw new ClassCastException();
}
}
class Son extends Father {
void test() {
System.out.println("子類");
}
}
class Demo14 {
public static void main(String[] args) {
Father f = new Son();
f.test();
}
}
2:非運(yùn)行時(shí)異常
1:定義父類的test2方法呼伸,拋出非運(yùn)行時(shí)異常身冀,例如拋出ClassNotFoundException
- 1:此時(shí)父類test2方法必須聲明異常,因?yàn)槭欠沁\(yùn)行時(shí)異常
- 2:Son類定義test2 方法括享,拋出和父類一樣的異常搂根,聲明異常
- 3:使用多態(tài)創(chuàng)建子類對(duì)象,調(diào)用test方法铃辖,調(diào)用test2方法剩愧,
1:聲明非運(yùn)行時(shí)異常的方法,在調(diào)用時(shí)需要處理娇斩,所以在main方法調(diào)用時(shí)throws
2:實(shí)現(xiàn)了重寫(xiě)仁卷,執(zhí)行子類的test2方法
3:總結(jié)子類重寫(xiě)父類方法可以拋出和父類一樣的異常穴翩,或
者不拋出異常。
// 1 子類覆蓋父類方法父類方法拋出異常锦积,子類的覆蓋方法可以不拋出異常
class Father {
void test() throws ClassNotFoundException { // 非運(yùn)行時(shí)異常
System.out.println("父類");
throw new ClassNotFoundException();
}
}
class Son extends Father {
void test() {
System.out.println("子類");
// 父類方法有異常藏否,子類沒(méi)有。
}
}
class Demo14 {
public static void main(String[] args) throws ClassNotFoundException {
Father f = new Son();
f.test();
}
}
4:子類拋出并聲明比父類大的異常例如子類test2方法拋出Exception
1:編譯失敗充包,無(wú)法覆蓋
2:子類不能拋出父類異常的父類。
3:總結(jié)子類不能拋出比父類的異常更大的異常遥椿。
//2:子類覆蓋父類方法不能比父類拋出更大異常
class Father {
void test() throws Exception {
// 非運(yùn)行時(shí)異常
System.out.println("父類");
throw new Exception();
}
}
class Son extends Father {
void test() throws ClassNotFoundException { // 非運(yùn)行時(shí)異常
System.out.println("子類");
throw new ClassNotFoundException();
}
}
class Demo14 {
public static void main(String[] args) throws Exception {
Father f = new Son();
f.test();
}
}
3:總結(jié)
1:子類覆蓋父類方法是基矮,父類方法拋出異常,子類的覆蓋方法可以不拋
出異常冠场,或者拋出父類方法的異常家浇,或者該父類方法異常的子類。
2:父類方法拋出了多個(gè)異常碴裙,子類覆蓋方法時(shí)钢悲,只能拋出父類異常的子
集
3:父類沒(méi)有拋出異常子類不可拋出異常
- 子類發(fā)生非運(yùn)行時(shí)異常,需要進(jìn)行try{}catch的(){}處理舔株,不能
拋出莺琳。
4:子類不能比父類拋出更多的異常
finally
- 實(shí)現(xiàn)方式一:
try{ // 可能發(fā)生異常的代碼 } catch( 異常類的類型 e ){ // 當(dāng)發(fā)生指定異常的時(shí)候的處理代碼 }catch...
比較適合用于專門(mén)的處理異常的代碼,不適合釋放資源的代碼载慈。 - 實(shí)現(xiàn)方式二:
try{ } catch(){} finally{ // 釋放資源的代碼 }
finally塊是程序在正常情況下或異常情況下都會(huì)運(yùn)行的惭等。
比較適合用于既要處理異常又有資源釋放的代碼 - 實(shí)現(xiàn)方式三
try{ }finally{ // 釋放資源 }
比較適合處理的都是運(yùn)行時(shí)異常且有資源釋放的代碼。- finally:關(guān)鍵字主要用于釋放系統(tǒng)資源办铡。
- 在處理異常的時(shí)候該語(yǔ)句塊只能有一個(gè)辞做。
- 無(wú)論程序正常還是異常,都執(zhí)行finally寡具。
- finally是否永遠(yuǎn)都執(zhí)行秤茅?
1:只有一種情況,但是如果JVM退出了System.exit(0)童叠,finally就不執(zhí)行框喳。
2:return都不能停止finally的執(zhí)行過(guò)程。
案例使用流
- 使用FileInputStream加載文件拯钻。
導(dǎo)包import java.io.FileInputStream; - FileNotFoundException
導(dǎo)入包import java.io.FileNotFoundException; - IOException
import java.io.IOException;
public class FinallyDemo {
// 本例子使用finally 關(guān)閉系統(tǒng)資源帖努。
public static void main(String[] args) {
FileInputStream fin = null;
try {
System.out.println("1創(chuàng)建io流可能出現(xiàn)異常");
fin = new FileInputStream("aabc.txt"); // 加載硬盤(pán)的文本文件到內(nèi)存,通過(guò)流
// System.out.println(fin);
} catch (FileNotFoundException e) {
System.out.println("2沒(méi)有找到abc.txt 文件");
System.out.println("3catch 了");
// System.exit(0);
// return;
}
// finally
finally {
System.out.println("4fianlly執(zhí)行");
if (fin != null) { // 如果流對(duì)象為null 流對(duì)象就不存在粪般,沒(méi)有必要關(guān)閉資源
try {
fin.close();
} catch (IOException e) {
e.printStackTrace();
System.out.println("close 異常");
}
}
System.out.println("5finally over");
}
System.out.println("6mainover");
}
}
// 2:無(wú)論程序正常還是異常拼余,都執(zhí)行finally。 但是遇到System.exit(0); jvm退出亩歹。
// finally用于必須執(zhí)行的代碼匙监, try{} catch(){}finally{}
// try{}finally{}
思考:
為什么要將一個(gè)類定義成內(nèi)部類凡橱?
匿名內(nèi)部類的使用和細(xì)節(jié)(面試題)
異常的思想和體系特點(diǎn)?
throws和throw的如何使用亭姥?
什么時(shí)候try 什么時(shí)候throws稼钩?
編譯時(shí)被檢測(cè)異常和運(yùn)行時(shí)異常的區(qū)別?
異常的所有細(xì)節(jié)达罗?
finally的應(yīng)用坝撑?
包的作用,名稱空間的定義和理解粮揉?
jar包的基本使用巡李。只要將類和包都存儲(chǔ)到j(luò)ar中,方便于使用扶认。只要將jar配置到classpath路徑下侨拦。