Java異常學(xué)習(xí)

NO.1 簡單異常演示
public static void main (String[] args) {
        //Java異常學(xué)習(xí)--Exception
        /**
         * * A:JVM默認(rèn)是如何處理異常的
         * main函數(shù)收到這個問題時,有兩種處理方式:
         * a:自己將該問題處理,然后繼續(xù)運行
         * b:自己沒有針對的處理方式,只有交給調(diào)用main的jvm來處理
         * jvm有一個默認(rèn)的異常處理機(jī)制,就將該異常進(jìn)行處理.
         * 并將該異常的名稱,異常的信息.異常出現(xiàn)的位置打印在了控制臺上,同時將程序停止運行
         * B:案例演示
         * JVM默認(rèn)如何處理異常
         */

     Demo3 d = new Demo3();
    // int x = d.div(10,2);
   //這樣正常調(diào)用是沒問題的
        int x = d.div(10,0);
        //我們讓除數(shù)為0.就會拋出異常
        System.out.println(x);//java.lang.ArithmeticException
       //以后我們看錯誤從后往前看蚕涤,先來到出錯的每一行,最后看運行時異常
    }

}
class  Demo3 {
    public int div(int a, int b) {
        return a / b;
    }
}

NO.2 異常處理的方式
#第一種
public static void main (String[] args) {
        /**
         * * A:異常處理的兩種方式
         * a:try?catch?finally
         * try catch
         * try catch finally
         * try finally 
         * b:throws
         * B:try...catch處理異常的基本格式
         * try?catch?finally
         * C:案例演示
         * try...catch的方式處理1個異常

         try:用來檢測異常的
         catch:用來捕獲異常的
         finally:釋放資源

         世界上最真情的相依就是你在try我在catch,無論你發(fā)神馬脾氣,我都靜靜接受,默默處理
         當(dāng)通過trycatch將問題處理了,程序會繼續(xù)執(zhí)行
         */
      
            Demo2 d = new Demo2();
            try{
                int x = d.div(10, 0);
                System.out.println(x);
            }catch(ArithmeticException a) {     //ArithmeticException a = new ArithmeticException();
                System.out.println("出錯了,除數(shù)為零了");
            }
              //我們經(jīng)過主動異常處理铣猩,就可以繼續(xù)執(zhí)行程序了
              System.out.println("1111111111111111");
        }

    }
    class Demo2 {
        /*
         * 除法運算
         */
        public int div(int a,int b) {       //a = 10,b = 0
            return a / b;                   // 10 / 0  被除數(shù)是10,除數(shù)是0當(dāng)除數(shù)是0的時候違背了算數(shù)運算法則,拋出異常
            //new ArithmeticException("/ by zero");
        }
    } 

#第二種
/**
     * * A:案例演示
     * try...catch的方式處理多個異常
     * JDK7以后處理多個異常的方式及注意事項
     * 
     * 安卓,客戶端開發(fā),如何處理異常?try{}catch(Exception e){}
     * ee,服務(wù)端開發(fā),一般都是底層開發(fā),從底層向上拋
     * 
     * try后面如果跟多個catch,那么小的異常放前面,大的異常放后面,根據(jù)多態(tài)的原理,如果大的放前面,就會將所有的子類對象接收
     * 后面的catch就沒有意義了
     */
    public static void main(String[] args) {
        //demo1();
        int a = 10;
        int b = 0;
        int[] arr = {11,22,33,44,55};
        
        //JDK7如何處理多個異常
        try {
            System.out.println(a / b);
            System.out.println(arr[10]);
        } catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
            System.out.println("出錯了");
        } 
    }

    public static void demo1() {
        int a = 10;
        int b = 0;
        int[] arr = {11,22,33,44,55};
        
        try {
            System.out.println(a / b);
            System.out.println(arr[10]);
            arr = null;
            System.out.println(arr[0]);
        } catch (ArithmeticException e) {
            System.out.println("除數(shù)不能為零");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("索引越界了");
        } catch (Exception e) {             //Exception e = new NullPointerException();
            System.out.println("出錯了");
        }
        
        System.out.println("over");
    }
}

NO.3 編譯時異常和運行時異常的區(qū)別
//Java中的異常分為編譯期和運行期異常
        //寫個編譯期異常--編譯時異骋就可以理解為未雨綢繆異常
        //編譯時異常就是必須對其進(jìn)行處理,不然編譯是不通過的
        //這個FileInputStream就是讀取文件的达皿,現(xiàn)在在自動編譯的時候就報錯了天吓。
        //因為我們這個文件路徑可能是錯誤的,就讀取不到峦椰,所以我們做下處理

        //運行時異常:就是程序員的代碼錯誤龄寞,需要程序員回來修改代碼

        try {
            FileInputStream stre = new FileInputStream("tmac.xxx");
        }catch (Exception e){

        }

NO.4 Throwable的幾個常見方法
/**
     * * A:Throwable的幾個常見方法
            * a:getMessage()
                * 獲取異常信息,返回字符串汤功。
            * b:toString()
                * 獲取異常類名和異常信息物邑,返回字符串。
            * c:printStackTrace()
                * 獲取異常類名和異常信息,以及異常出現(xiàn)在程序中的位置色解。返回值void茂嗓。
        * B:案例演示
            * Throwable的幾個常見方法的基本使用
     */
    public static void main(String[] args) {
        try {
            System.out.println(1/0);
        } catch (Exception e) {         //Exception e = new ArithmeticException("/ by zero");
            //System.out.println(e.getMessage());       //獲取異常信息
            //System.out.println(e);        //調(diào)用toString方法,打印異常類名和異常信息
            e.printStackTrace();        //jvm默認(rèn)就用這種方式處理異常
        }
    }
}

NO.5 throws拋出異常的處理方式
/**
     * * A:throws的方式處理異常
            * 定義功能方法時,需要把出現(xiàn)的問題暴露出來讓調(diào)用者去處理科阎。
            * 那么就通過throws在方法上標(biāo)識在抛。
        * B:案例演示
            * 舉例分別演示編譯時異常和運行時異常的拋出
            * 編譯時異常的拋出必須對其進(jìn)行處理
            * 運行時異常的拋出可以處理也可以不處理
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
        Person p = new Person();
        p.setAge(-17);
        System.out.println(p.getAge());
    }

}

class Person {
    private String name;
    private int age;
    public Person() {
        super();
        
    }
    public Person(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) throws AgeOutOfBoundsException {
        if(age >0 && age <= 150) {
            this.age = age;
        }else {
            //Exception e = new Exception("年齡非法");
            //throw e;
            throw new AgeOutOfBoundsException("年齡非法");
        }
      }
    }

NO.6 finaly關(guān)鍵字的作用和特點
/**
     * * A:finally的特點
            * 被finally控制的語句體一定會執(zhí)行
            * 特殊情況:在執(zhí)行到finally之前jvm退出了(比如System.exit(0))
        * B:finally的作用
            * 用于釋放資源,在IO流操作和數(shù)據(jù)庫操作中會見到
        * C:案例演示
            * finally關(guān)鍵字的特點及作用
        *return語句相當(dāng)于是方法的最后一口氣,那么在他將死之前會看一看有沒有finally幫其完成遺愿,如果有就將finally執(zhí)行
        *后在徹底返回
     */
    public static void main(String[] args) {
        try {
            System.out.println(10/0);
        } catch (Exception e) {
            System.out.println("除數(shù)為零了");
            System.exit(0);                             //退出jvm虛擬機(jī)
            return;
        } finally {
            System.out.println("看看我執(zhí)行了嗎");
        }
    }

NO.7 簡單面試題
//面試題
      //final,finally和finalize的區(qū)別
        //final:可以修飾類萧恕,不能被繼承刚梭,修飾方法,不能被重寫票唆,修飾變量朴读,只能賦值一次
        //finally:是try語句中的一個語句體,不能被單獨使用走趋,用來釋放資源
        //finalize:是一個方法衅金,當(dāng)垃圾回收器確定存在對該對象的過多引用時,由該對象的垃圾回收器調(diào)用此方法

        //第二題:
        //問:如果catch里面有return語句簿煌,finally的代碼還會執(zhí)行嗎氮唯?如果會,請問是在return前還是return后
        //答:是在return先建立返回路徑姨伟,然后執(zhí)行finally語句惩琉,最后返回
        //看這個例子
        Test test = new Test();
       int num =  test.method();
        System.out.println(num);
    }
}

class Test {
  public  int method(){
        int x = 10;
        try{
            x = 20;
            System.out.println(1/0);
            return x;
        }catch (Exception e){
            x = 30;
            return x;
        }finally {
            x = 40;
            System.out.println("finally執(zhí)行了嘛");
    //千萬不要在finally里面寫返回語句,因為finally的作用是釋放資源夺荒,是肯定執(zhí)行的瞒渠。如果在這里面寫了返回語句,那么try和catch的結(jié)果都會被改變          
      }
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末技扼,一起剝皮案震驚了整個濱河市伍玖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剿吻,老刑警劉巖窍箍,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異丽旅,居然都是意外死亡椰棘,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門魔招,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晰搀,“玉大人五辽,你說我怎么就攤上這事办斑。” “怎么了?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵乡翅,是天一觀的道長鳞疲。 經(jīng)常有香客問我,道長蠕蚜,這世上最難降的妖魔是什么尚洽? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮靶累,結(jié)果婚禮上腺毫,老公的妹妹穿的比我還像新娘。我一直安慰自己挣柬,他們只是感情好潮酒,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著邪蛔,像睡著了一般急黎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上侧到,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天勃教,我揣著相機(jī)與錄音,去河邊找鬼匠抗。 笑死故源,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汞贸。 我是一名探鬼主播心软,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼著蛙!你這毒婦竟也來了删铃?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤踏堡,失蹤者是張志新(化名)和其女友劉穎猎唁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體顷蟆,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡诫隅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了帐偎。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逐纬。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖削樊,靈堂內(nèi)的尸體忽然破棺而出豁生,到底是詐尸還是另有隱情兔毒,我是刑警寧澤,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布甸箱,位于F島的核電站育叁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芍殖。R本人自食惡果不足惜豪嗽,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豌骏。 院中可真熱鬧龟梦,春花似錦、人聲如沸窃躲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽框舔。三九已至蹦玫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刘绣,已是汗流浹背樱溉。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留纬凤,地道東北人福贞。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像停士,于是被迫代替她去往敵國和親挖帘。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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

  • 1 Log4j 1.1 什么是Log4j? Log4j是Apache的一個開源項目,通過使用Log4j蜻底,我...
    咿呀_Java閱讀 354評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法骄崩,類相關(guān)的語法,內(nèi)部類的語法薄辅,繼承相關(guān)的語法要拂,異常的語法,線程的語...
    子非魚_t_閱讀 31,643評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,182評論 25 707
  • 我出生在東北一個小城市站楚,考上大學(xué)后離開家到外地上學(xué)并且留在外地工作脱惰,很多年里我都在找尋一種叫做身份認(rèn)同的狀態(tài),比如...
    aqua36閱讀 277評論 0 0
  • #58號雕刻打卡Day32# 1.九點靠墻站 10分鐘 感受:站的時間也是身體排氣的過程窿春,或打嗝或放屁拉一,每每都是采盒。...
    一然2016閱讀 78評論 0 0