Java中的異常處理機(jī)制

<small>
Java 中的異常處理機(jī)制:
Java中的異常有兩大類:
Error:系統(tǒng)錯(cuò)誤,往往是 由軟件運(yùn)行的硬件換件遭破壞所導(dǎo)致的,無(wú)法通過(guò)Java代碼來(lái)實(shí)現(xiàn)修復(fù)。如:機(jī)房斷電鸠珠,服務(wù)器宕機(jī),網(wǎng)絡(luò)異常……
Exception:代碼異常,往往是由于程序設(shè)計(jì)的瑕疵女气,導(dǎo)致代碼在運(yùn)行中發(fā)生錯(cuò)誤谒主,并導(dǎo)致程序最終無(wú)法完成功能的實(shí)現(xiàn)榛斯,甚至導(dǎo)致程序無(wú)法運(yùn)行,分析錯(cuò)誤發(fā)生的原因,找到有瑕疵的代碼拌屏,修復(fù)bug更新端圈。其中又分為兩類
1仑嗅、CheckedException:
檢查時(shí)異常(又名編譯期異常)直接由Java編程工具IDE(如eclipse)在編譯期對(duì)代碼判斷俗他,給出異常提示,這類異常特點(diǎn):僅僅 提示異常錯(cuò)誤,表示對(duì)應(yīng)的地方可能會(huì)由于書寫不規(guī)范導(dǎo)致異常的發(fā)生,目的是為了提醒開發(fā)者在此處一定要細(xì)心編程不要出現(xiàn)書寫錯(cuò)誤寨腔,這類異常都是Exception 如日期操作時(shí):parseException
IO流操作時(shí)FileNotFoundException乾蛤,IOException庙楚,數(shù)據(jù)庫(kù)操作時(shí)纳账,SQLException

2啤呼、UncheckedException
非檢查異常(又名運(yùn)行期異常)醇锚,是RunTimeException的子類赶促,此類異常的存在就是bug婿滓,是由于程序員的設(shè)計(jì)瑕疵卿吐,代碼邏輯結(jié)構(gòu)問題導(dǎo)致代碼在運(yùn)行中發(fā)生的錯(cuò)誤異常衍腥。
特點(diǎn):運(yùn)行時(shí)后臺(tái)報(bào)錯(cuò),代碼運(yùn)行失敗憾儒。
如:NullPointerException………………
此類異常在程序開發(fā)時(shí)沒有變異錯(cuò)誤提示边琉,只有在運(yùn)行時(shí)后臺(tái)報(bào)錯(cuò)怒竿,代碼運(yùn)行失敗
如何解決:出現(xiàn)bug分析原因找到錯(cuò)誤代碼塊巩检,給予修復(fù),并更新

Java中的異常處理機(jī)制主要就是針對(duì)CheckedException(編譯期期)異常的處理

異常處理

java中的異常處理機(jī)制
1窍株、CheckedException
檢查時(shí)異常(編譯期異常)微驶,
此類異常的出現(xiàn)梁呈,是提醒程序員颈嚼,認(rèn)真仔細(xì)的對(duì)待代碼。
如果不按照規(guī)范來(lái)書寫瓶蚂,可能會(huì)導(dǎo)致相關(guān)的異常出現(xiàn)。
編譯期異常才是java中需要提前處理的叼架。
有兩種解決方案:
1)哥遮、向外拋
在代碼所在的方法上扔茅,直接添加throws 異常。
此方案絕對(duì)不是最終解決方案侣诺,向上拋膳算,要求
方法調(diào)用者有鹿,接受到異常是需要處理的。
2)际看、捕獲異常,并處理異常。
語(yǔ)法:

  try{
   可能發(fā)生異常的代碼;
  }catch(可能發(fā)生的異常類型){
  捕獲到異常后悴了,需要執(zhí)行的后續(xù)代碼。
  }
    public static void exceptionTest() throws ParseException{
        SimpleDateFormat sdf = 
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
    
        Date date = 
                sdf.parse("2016-1020 14:06:00");
    }

    public static void main(String[] args) {
        /*

        try{
            //可能發(fā)生異常的代碼;
            exceptionTest();
        }catch(ParseException e /*可能發(fā)生的異常類型*/){
            
            //打印異常的堆棧信息弊添,為了方便異常的修復(fù)努潘。
            e.printStackTrace();
            
            //捕獲到異常后眠冈,需要執(zhí)行的后續(xù)代碼。
            System.out.println("捕獲到了ParseException異常菌瘫。");

try-catch-finally 還可以做以下操作:
2)蜗顽、捕獲異常,并處理異常雨让。

 *          try - catch - finally
 * 
 *          語(yǔ)法:
 *          try{
 *              可能發(fā)生異常的代碼;
 *          }catch(可能發(fā)生的異常類型1){
 *              捕獲到異常后雇盖,需要執(zhí)行的后續(xù)代碼。
 *          }
 *          ......//catch多個(gè)
 *          finally{
 *              最終需要執(zhí)行的代碼
 *              //最終:無(wú)論是否捕獲異常宫患。
 *          }
 * 
 *          注意:
 *              a刊懈、try、finally只能一次娃闲,catch可以沒有虚汛。
 *              b、finally可以直接跟在try后皇帮。
 * 
 *  Java異常處理機(jī)制的解決之道:
 *      ****能捕獲就捕獲卷哩,捕獲不了再向外拋。
java中的異常處理機(jī)制

throw属拾、throws關(guān)鍵字
1)将谊、throw
認(rèn)為的就地拋出一個(gè)異常。
用在代碼中渐白。
2)尊浓、throws
方法可能會(huì)拋出某類異常。
至于最后會(huì)不會(huì)拋出異常纯衍,看代碼栋齿。
用在方法上。

public static void throwTest(){
        System.out.println("throwTest");
        //就地拋出一個(gè)空指針異常襟诸。
        throw new NullPointerException();
    }
    public static void throwsTest()
                throws NullPointerException{
        System.out.println("throwsTest");
    }
    
    public static void main(String[] args) {
//      throwTest();
        
        throwsTest();
    }
finalize瓦堵、final、finally關(guān)鍵字
  •  1)歌亲、finalize
    
  •      Object類中的方法
    
  •      用于判斷堆中是否含有沒有引用指向的對(duì)象內(nèi)存菇用。
    
  •      在GC方法前執(zhí)行。
    
  •  2)陷揪、final
    
  •      修飾符
    
  •      修飾的變量是常量惋鸥,一旦初始化,就不能改變其值悍缠。
    
  •      修飾的方法揩慕,無(wú)法被重寫。
    
  •      修飾的類扮休,無(wú)法被繼承迎卤。
    
  •  3)、finally
    
  •      Java中異常處理機(jī)制中的關(guān)鍵字玷坠。
    
  •      try - catch - finally
    
  •      finally中執(zhí)行的代碼塊蜗搔,無(wú)論是否發(fā)生異常,
    
  •      都將會(huì)被執(zhí)行的代碼八堡。
    
finally里面樟凄,絕對(duì)不建議使用return關(guān)鍵字。
 *      因?yàn)閒inally中使用return兄渺,
 *      可能會(huì)影響到代碼的真實(shí)結(jié)果缝龄。

例子如下:

public static void main(String[] args) {
        System.out.println(test(null));//3
        System.out.println(test("a"));//3
        System.out.println(test("我愛你中國(guó)!"));//3
    }
    public static int test(String str){
        try{
            str.toString();
            str.charAt(5);
            return 0;
        }catch(NullPointerException e){
            return 1;
        }catch(StringIndexOutOfBoundsException e){
            return 2;
        }finally{
//          return 3;
自定義異常

步驟:step1:自定義異常類繼承Exception
step2:定義異常構(gòu)造
自定義異常就是CheckedException。

public class ExceptionDemo07 {
    public static void main(String[] args) {
        //模擬卡內(nèi)余額不足叔壤,調(diào)用自定義異常
        Scanner sc = new Scanner(System.in);
        double money = sc.nextDouble();
        if(money > 100){
            //模擬卡中只有100
            try {
                throw new NoMoreMoneyException();
            } catch (NoMoreMoneyException e) {
                e.printStackTrace();
            }
        }else if(money > 0){
            System.out.println("請(qǐng)取走你的現(xiàn)金...");
        }else{
            try {
                throw new NoMoreMoneyException("輸入金額非法");
            } catch (NoMoreMoneyException e) {
                e.printStackTrace();
            }
        }
    }
}

//step1:自定義異常類繼承Exception
class NoMoreMoneyException extends Exception{
    public NoMoreMoneyException() {
        System.out.println("卡內(nèi)余額不足");
    }

    public NoMoreMoneyException(String arg0, Throwable arg1, boolean arg2,
            boolean arg3) {
        super(arg0, arg1, arg2, arg3);
        // TODO Auto-generated constructor stub
    }

    public NoMoreMoneyException(String arg0, Throwable arg1) {
        super(arg0, arg1);
    }

    public NoMoreMoneyException(String arg0) {
        super(arg0);
    }

    public NoMoreMoneyException(Throwable arg0) {
        super(arg0);
        // TODO Auto-generated constructor stub
    }
}
Exception方法介紹
public static void main(String[] args) throws FileNotFoundException {
        Exception e = new NullPointerException();
        /*
         * 1瞎饲、打印異常堆棧信息
         */
//      e.printStackTrace();
        
        /*
         * 2、異常信息
         */
//      System.out.println(e.getMessage());
        
        /*
         * 3炼绘、異常的發(fā)生原因
         */
        System.out.println(e.getCause());
        
        /*
         * 4嗅战、將異常的堆棧信息,記錄在指定文件中俺亮。
         *      對(duì)應(yīng)的文件驮捍,被稱為錯(cuò)誤信息日志。
         *      便于日后的BUG修復(fù)脚曾、維護(hù)东且。
         */
        PrintWriter pw = new PrintWriter("error.txt");
        e.printStackTrace(pw);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市本讥,隨后出現(xiàn)的幾起案子苇倡,更是在濱河造成了極大的恐慌,老刑警劉巖囤踩,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旨椒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡堵漱,警方通過(guò)查閱死者的電腦和手機(jī)综慎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)勤庐,“玉大人示惊,你說(shuō)我怎么就攤上這事∮淞” “怎么了米罚?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)丈探。 經(jīng)常有香客問我录择,道長(zhǎng),這世上最難降的妖魔是什么碗降? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任隘竭,我火速辦了婚禮,結(jié)果婚禮上讼渊,老公的妹妹穿的比我還像新娘动看。我一直安慰自己,他們只是感情好爪幻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布菱皆。 她就那樣靜靜地躺著须误,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仇轻。 梳的紋絲不亂的頭發(fā)上京痢,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音拯田,去河邊找鬼历造。 笑死甩十,一個(gè)胖子當(dāng)著我的面吹牛船庇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侣监,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼鸭轮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了橄霉?” 一聲冷哼從身側(cè)響起窃爷,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姓蜂,沒想到半個(gè)月后按厘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钱慢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年逮京,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片束莫。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡懒棉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出览绿,到底是詐尸還是另有隱情策严,我是刑警寧澤,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布饿敲,位于F島的核電站妻导,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏怀各。R本人自食惡果不足惜栗竖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渠啤。 院中可真熱鬧狐肢,春花似錦、人聲如沸沥曹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至僵腺,卻和暖如春鲤孵,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辰如。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工普监, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人琉兜。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓凯正,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親豌蟋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子廊散,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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

  • 大家好,我是IT修真院鄭州分院第6期的學(xué)員李亞衡梧疲,一枚正直純潔善良的JAVA程序員 今天給大家分享一下允睹,修真院官網(wǎng)...
    一筒君閱讀 361評(píng)論 0 0
  • 先上圖 Java中所有的異常類都是繼承于Throwable的,表示可以拋出的對(duì)象幌氮。 Error(錯(cuò)誤):是程序無(wú)法...
    yang2yang閱讀 264評(píng)論 0 0
  • Java中的異常處理機(jī)制 0x00異常 異常分為Error和Exception缭受,我們通常說(shuō)的處理異常,其實(shí)是處理E...
    78848d676612閱讀 558評(píng)論 0 0
  • ?這是奇小娜每天一篇原創(chuàng)文章的第90天 每天一篇原創(chuàng)文章塘雳,至今已經(jīng)三個(gè)月的時(shí)間了,如此的過(guò)程普筹,到底到我的生活帶來(lái)多...
    奇小娜閱讀 560評(píng)論 0 51
  • 夜下風(fēng)聲败明,生雨為伴。 離別三更太防,提筆忘字妻顶。 弱冠之年,風(fēng)華正茂蜒车。 漂浮之心讳嘱,如沐滄桑。 孤生寡念酿愧,仗劍...
    伏林閱讀 315評(píng)論 0 0