7-Java異常

異常:
現(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);
*/
內(nèi)存溢出壕曼,需要的內(nèi)存超出了Java虛擬機(jī)管理的內(nèi)存范圍
找不到類文件

它指的是一個(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)行異常處理。

  1. 當(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)。
  1. 和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)行return

  • NullPointerException
    進(jìn)行if判斷,是否為null

  • ArrayIndexOutOfBoundsException
    使用數(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
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路徑下侨拦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辐宾,隨后出現(xiàn)的幾起案子狱从,更是在濱河造成了極大的恐慌,老刑警劉巖叠纹,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件季研,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡誉察,警方通過(guò)查閱死者的電腦和手機(jī)训貌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)冒窍,“玉大人递沪,你說(shuō)我怎么就攤上這事∽垡海” “怎么了款慨?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)谬莹。 經(jīng)常有香客問(wèn)我檩奠,道長(zhǎng),這世上最難降的妖魔是什么附帽? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任埠戳,我火速辦了婚禮,結(jié)果婚禮上蕉扮,老公的妹妹穿的比我還像新娘整胃。我一直安慰自己,他們只是感情好喳钟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布屁使。 她就那樣靜靜地躺著在岂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛮寂。 梳的紋絲不亂的頭發(fā)上蔽午,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天,我揣著相機(jī)與錄音酬蹋,去河邊找鬼及老。 笑死,一個(gè)胖子當(dāng)著我的面吹牛范抓,可吹牛的內(nèi)容都是我干的写半。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼尉咕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了璃岳?” 一聲冷哼從身側(cè)響起年缎,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铃慷,沒(méi)想到半個(gè)月后单芜,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡犁柜,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年洲鸠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片馋缅。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扒腕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萤悴,到底是詐尸還是另有隱情瘾腰,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布覆履,位于F島的核電站蹋盆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏硝全。R本人自食惡果不足惜栖雾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望伟众。 院中可真熱鬧析藕,春花似錦、人聲如沸凳厢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至找爱,卻和暖如春梗顺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背车摄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工寺谤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吮播。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓变屁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親意狠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粟关,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容