溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

黑馬程序員——異常篇

發(fā)布時間:2020-08-08 18:44:02 來源:網(wǎng)絡 閱讀:330 作者:optimisticpig 欄目:移動開發(fā)

------- android培訓、java培訓、期待與您交流! ----------

異常:

   是什么?是對問題的描述。將問題進行對象的封裝。

-----------------------------------------------------

   異常體現(xiàn):

Throwable

|--Error

|--Exception

|--RuntimeException

       異常體系的特點:異常體系中的所有類以及建立的對象都具備可拋性。也就是說可以被throw和throws關鍵字所操作。只有異常體系具備這個特點。

-------------------------------------------------------

   throw和throws的用法:

       throw定義在函數(shù)內(nèi),用于拋出異對象。

       throws定義在函數(shù)上,用于拋出異常類,可以拋出多個,用逗號隔開。


       當函數(shù)內(nèi)容有throw拋出異常對象,并未進行try處理。必須要在函數(shù)上聲明,都在編譯失敗。

       注意,RuntimeException除外。也就是說函數(shù)內(nèi)如果拋出RuntimeException異常,函數(shù)上可以不用聲明。

------------------------------------------------------

   異常有兩種:

編譯時被檢測異常:

該異常在編譯時,如果沒有處理(沒有throw也沒有try),編譯失敗。

運行時異常(編譯時不檢測):

在編譯時,不需要處理,編譯器不檢查。該異常的發(fā)生,建議不處理,讓程序停止。需要對代碼進行修正。

       如果函數(shù)聲明了異常,調(diào)用者需要進行處理。處理方法可以throws,可以try。

--------------------------------------------------

   異常處理語句:

       try

       {

需要被檢測的代碼;

       }

       catch ()

       {

處理異常的代碼;

       }

       finally

       {

一定會執(zhí)行的代碼;

       }

       有三個結合格式:

           1.try

{

}

catch ()

{

}


           2.try

{

}

catch ()

{

}

finally

{

}


           3.try

{

}

finally

{

}

   注意:

   1,finally中定義的通常是 關閉資源代碼。因為資源必須釋放。

   2,finally只要一種情況不會執(zhí)行。當執(zhí)行到System.exit(0);finally不會執(zhí)行。

--------------------------------------------

   自定義異常:

定義類繼承Exception或者RuntimeException

1,為了讓該自定義類具備可拋性。

2,讓該類具備操作異常的共性方法。


當要定義自定義異常的信息時,可以使用父類已經(jīng)定義好的功能。

將信息傳遞給父類構造函數(shù)。

class MyException extends Exception

{

MyException(String message)

{

super(message);

}

}

   自定義異常:安卓java面向對象的思想,將程序中出現(xiàn)的特有問題進行封裝。

-------------------------------------------

   異常的好處:

1,將問題進行封裝。

2,將正常流程代碼和問題處理代碼相分離,方便于閱讀。

-------------------------------------------        

異常的處理原則:

1,處理方式有兩種:try或者throws。

2,調(diào)用到拋出異常的功能時,拋出幾個就處理幾個。

一個try對應多個catch。

3,多個catch,父類的catch放到最下面。

4,catch內(nèi),需要定義針對性的處理方式。不要簡單的定義printStackTrace,輸出語句。也不要不寫。

       5,當捕獲到的異常,本功能處理不了時,可以繼續(xù)在catch中拋出。

try

{

throw newAException();

}

catch (AException e)

{

throw e;

}

如果該異常處理不了,但并不屬于該功能出現(xiàn)的異常。可以將異常轉換后,在拋出和該功能相關的異常。

       或者異??梢蕴幚?,當需要將異常產(chǎn)生的和本功能相關的問題提供出去。當調(diào)用者知道,并處理。也可以將捕獲異常處理后,轉換新的異常。

try

{

throw new AException();

}

catch (AException e)

{

//對AException處理。

throw new BException();

           }

           比如:匯款的例子。

-------------------------------------------  

   異常的注意事項:

       在子父類覆蓋時:

1,子類拋出的異常必須是父類的異常的子類或者子集。

2,如果父類或者接口沒有異常拋出時,子類覆蓋出現(xiàn)異常只能try不能throw。


示例:ExceptionTest.java 老師用電腦上課。

/*
畢老師用電腦上課。
開始思考上課中出現(xiàn)的問題:電腦藍屏,電腦冒煙。
當冒煙發(fā)生后,老師不能繼續(xù)講課。出現(xiàn)了講師的問題,課時計劃無法完成。
思路:
定義兩個類,老師和電腦。
老師有姓名,上課方法(使用電腦上課),
電腦冒煙時,講師有無法完成課時計劃的問題。
電腦有運行方法、重啟方法。
考慮電腦可能出現(xiàn)的問題:電腦藍屏,電腦冒煙,定義兩個異常類。
*/
class LanPingException extends Exception
{
    LanPingException(String message)
    {
        super(message);
    }
}
class MaoYanException extends Exception
{
    MaoYanException(String message)
    {
        super(message);
    }
}
class NoPlanException extends Exception
{
    NoPlanException(String message)
    {
        super(message);
    }
}
class Teacher
{
    private String name;
    private Computer cmpt;
    Teacher(String name)
    {
        this.name = name;
        cmpt = new Computer();
    }
    public void prelect()throws NoPlanException
    {
        try
        {
            cmpt.run();//調(diào)用拋出異常的run方法
        }
        catch (LanPingException e)
        {
            cmpt.reset();
        }
        catch (MaoYanException e)
        {
            test();
            throw new NoPlanException("課時無法繼續(xù)"+e.getMessage());//處理不了,拋出異常,方法上拋出。
        }
        System.out.println("講課");
                                                                                                                       
    }
    public void test()
    {
        System.out.println("練習");
    }
}
class Computer
{
    private int state = 3;//代表電腦的狀態(tài)。
    public void run()throws LanPingException,MaoYanException
    {
        if (state == 2)
            throw new LanPingException("藍屏了");
        if (state  == 3)
            throw new MaoYanException("冒煙了");
        System.out.println("電腦運行");
    }
    public void reset()
    {
        state = 1;//電腦恢復到正常狀態(tài)。
        System.out.println("電腦重啟");
                                                                                                                       
    }
}
class ExceptionTest
{
    public static void main(String[] args)
    {
        Teacher t = new Teacher("畢老師");
        try
        {
            t.prelect();
        }
        catch (NoPlanException e)
        {
            System.out.println(e.toString());
            System.out.println("換老師或者放假");
        }
                                                                                                                       
    }
}


示例:ExceptionTest1.java 圖形面積。


/*
有一個圓形和長方形。
都可以獲取面積。對于面積如果出現(xiàn)非法數(shù)值,視為是獲取面積出現(xiàn)問題。
問題通過一次來表示。
先要對這個程序進行基礎設計。
思路:
1,定義抽象圖形類(或接口),獲取面積方法。
2,圓形,長方形類繼承圖形類。
3,對問題進行描述。
*/
class NoValueException extends RuntimeException
{
    NoValueException(String message)
    {
        super(message);
    }
}
interface Shape
{
    void getArea();
}
class Rec implements Shape
{
    private int len,wid;
    Rec(int len,int wid)//throws NoValueException
    {
        if (len<=0 || wid <= 0)
            throw new NoValueException("非法值");
        this.len = len;
        this.wid = wid;
    }
    public void getArea()
    {
        System.out.println(len*wid);
    }
}
class Circle implements Shape
{
    public static final double PI = 3.14;
    private int radius;
    Circle(int radius)
    {
        if (radius <=0)
            throw new NoValueException("非法半徑");
        this.radius = radius;
    }
    public void getArea()
    {
        System.out.println(radius*radius*PI);
    }
}
class ExceptionTest1
{
    public static void main(String[] args)
    {
        /*
        try
        {
            Rec r = new Rec(-3,4);
            r.getArea();
        }
        catch (NoValueException e)
        {
            System.out.println(e.toString());
        }
        */
        //Rec r = new Rec(-3,4);
        //r.getArea();
        Circle c = new Circle(-3);
        c.getArea();
    }
}



   定義包用package關鍵字。

   1:對類文件進行分類管理。

   2:給類文件提供多層名稱空間。

   如果生成的包不在當前目錄下,需要最好執(zhí)行classpath,將包所在父目錄定義到classpath變量中即可。

   一般在定義包名時,因為包的出現(xiàn)是為了區(qū)分重名的類。所以包名要盡量唯一。怎么保證唯一性呢?可以使用url域名來進行包名稱的定義。

   package pack;//定義了一個包,名稱為pack。 注意:包名的寫法規(guī)范:所有字母都小寫。

   //package cn.itcast.pack.demo;


   類的全名稱是 包名.類名

   編譯命令:javac –d 位置(.當前路徑) java源文件 (就可以自動生成包)


   包是一種封裝形式,用于封裝類,想要被包以外的程序訪問,該類必須public;類中的成員,如果被包以外訪問,也必須public;


   包與包之間訪問可以使用的權限有兩種:

       1:public

       2:protected:只能是不同包中的子類可以使用的權限。


java中的四種權限:

      范圍        public        protected       default      private

   同一個類中       ok             ok              ok          ok

   同一包中         ok             ok              ok      

   子類             ok          

   不同包中         ok

----------------------------------------------------

  Import - 導入:類名稱變長,寫起來很麻煩。為了簡化,使用了一個關鍵字:import,可以使用這個關鍵字導入指定包中的類。記?。簩嶋H開發(fā)時,到的哪個類就導入哪個類,不建議使用*.

       import packa.*;//這個僅僅是導入了packa當前目錄下的所有的類。不包含子包。

       import packa.abc.*;//導入了packa包中的子包abc下的當前的所有類。


       如果導入的兩個包中存在著相同名稱的類。這時如果用到該類,必須在代碼中指定包名。


常見的軟件包:

       java.lang : language java的核心包,Object System  String Throwable jdk1.2版本后,該包中的類自動被導入。

       java.awt : 定義的都是用于java圖形界面開發(fā)的對象。

       javax.swing:提供所有的windows桌面應用程序包括的控件,比如:Frame , Dialog, Table, List 等等,就是java的圖形界面庫。

       java.net : 用于java網(wǎng)絡編程方面的對象都在該包中。

       java.io : input  output 用于操作設備上數(shù)據(jù)的對象都在該包中。比如:讀取硬盤數(shù)據(jù),往硬盤寫入數(shù)據(jù)。

       java.util : java的工具包,時間對象,集合框架。

       java.applet: application+let 客戶端java小程序。server+let  --> servlet 服務端java小程序。

       

   jar :java的壓縮包,主要用于存儲類文件,或者配置文件等。

   命令格式:jar –cf 包名.jar 包目錄

   解壓縮:jar –xvf 包名.jar

   將jar包目錄列表重定向到一個文件中:jar –tf 包名.jar >c:\1.txt


向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI