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

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

2、UncheckedException
非檢查異常(又名運(yùn)行期異常),是RunTimeException的子類(lèi),此類(lèi)異常的存在就是bug,是由于程序員的設(shè)計(jì)瑕疵,代碼邏輯結(jié)構(gòu)問(wèn)題導(dǎo)致代碼在運(yùn)行中發(fā)生的錯(cuò)誤異常。
特點(diǎn):運(yùn)行時(shí)后臺(tái)報(bào)錯(cuò),代碼運(yùn)行失敗。
如:NullPointerException………………
此類(lèi)異常在程序開(kāi)發(fā)時(shí)沒(méi)有變異錯(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í)異常(編譯期異常),
此類(lèi)異常的出現(xiàn),是提醒程序員,認(rèn)真仔細(xì)的對(duì)待代碼。
如果不按照規(guī)范來(lái)書(shū)寫(xiě),可能會(huì)導(dǎo)致相關(guān)的異常出現(xiàn)。
編譯期異常才是java中需要提前處理的。
有兩種解決方案:
1)、向外拋
在代碼所在的方法上,直接添加throws 異常。
此方案絕對(duì)不是最終解決方案,向上拋,要求
方法調(diào)用者,接受到異常是需要處理的。
2)、捕獲異常,并處理異常。
語(yǔ)法:

  try{
   可能發(fā)生異常的代碼;
  }catch(可能發(fā)生的異常類(lèi)型){
  捕獲到異常后,需要執(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ā)生的異常類(lèi)型*/){
            
            //打印異常的堆棧信息,為了方便異常的修復(fù)。
            e.printStackTrace();
            
            //捕獲到異常后,需要執(zhí)行的后續(xù)代碼。
            System.out.println("捕獲到了ParseException異常。");

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

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

throw、throws關(guān)鍵字
1)、throw
認(rèn)為的就地拋出一個(gè)異常。
用在代碼中。
2)、throws
方法可能會(huì)拋出某類(lèi)異常。
至于最后會(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類(lèi)中的方法
    
  •      用于判斷堆中是否含有沒(méi)有引用指向的對(duì)象內(nèi)存。
    
  •      在GC方法前執(zhí)行。
    
  •  2)、final
    
  •      修飾符
    
  •      修飾的變量是常量,一旦初始化,就不能改變其值。
    
  •      修飾的方法,無(wú)法被重寫(xiě)。
    
  •      修飾的類(lèi),無(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("我愛(ài)你中國(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:自定義異常類(lèi)繼承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:自定義異常類(lèi)繼承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)的文件,被稱(chēng)為錯(cuò)誤信息日志。
         *      便于日后的BUG修復(fù)、維護(hù)。
         */
        PrintWriter pw = new PrintWriter("error.txt");
        e.printStackTrace(pw);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容