国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

#Java異常處理

nidaye / 1523人閱讀

摘要:例子二以下開(kāi)始用異常處理機(jī)制捕獲該異常在這里,這個(gè)其實(shí)就是這里用到了程序運(yùn)行時(shí)的多態(tài)思想。語(yǔ)句就像一個(gè)調(diào)用函數(shù),當(dāng)程序運(yùn)行中拋出了一個(gè)異常對(duì)象,就會(huì)調(diào)用對(duì)應(yīng)的來(lái)處理。

傳統(tǒng)的語(yǔ)言如何處理

在一些傳統(tǒng)的語(yǔ)言(如C語(yǔ)言中)

if語(yǔ)句來(lái)判斷是否出現(xiàn)了例外

全程變量ErrNo

但這有幾個(gè)缺點(diǎn)

正常處理與異常處理的代碼同樣處理

可讀性(readability)差

每次調(diào)用一個(gè)方法時(shí)都進(jìn)行錯(cuò)誤檢查

可維護(hù)性( maintainability )差錯(cuò)誤由誰(shuí)處理不請(qǐng)

職責(zé)不清

Java中的異常處理特點(diǎn):

Java中處理異常包括

拋出(throw)異常

運(yùn)行時(shí)系統(tǒng)在調(diào)用棧中查找

從生成異常的方法開(kāi)始進(jìn)行回溯,直到找到:

捕獲(catch) 異常的代碼
調(diào)用過(guò)程如下所示:

代碼 例子一

沒(méi)有使用Java異常處理機(jī)制

public class Test {
    public static void main(String [] args){
        for(int i = 0; i < 2;i++){
            System.out.print(i + " ");
            System.out.println(1/0);//throw an exception.
        }
    }
}

運(yùn)行結(jié)果:

0 Exception in thread "main" java.lang.ArithmeticException: / by zero

1/0明顯非法,所以產(chǎn)生了異常ArithmeticException對(duì)象,這個(gè)對(duì)象是Exception的子類(lèi)。

例子二

以下開(kāi)始用異常處理機(jī)制捕獲該異常:

public class Test {
    public static void main(String [] args){
        for(int i = 0; i < 2;i++){
            System.out.print(i + " ");
            try{
                System.out.println(1/0);//An exception will throw from here.
            }
            catch(Exception ex){//在這里,這個(gè)Exception 其實(shí)就是ArithmeticException
            //這里用到了程序運(yùn)行時(shí)的多態(tài)思想。
            //實(shí)際中應(yīng)指定具體的作為ex的類(lèi)型,更加有針對(duì)性。
                System.out.println("exception handling...");//
            }
        }
    }
}

運(yùn)行結(jié)果:

0 exception handling...
1 exception handling...

這樣確實(shí)能捕獲到相應(yīng)的異常對(duì)象。盡管什么也沒(méi)做(只是打印字符串),卻讓編譯器不再報(bào)告之前的異常。因?yàn)樯鲜?b>catch(type ex){...}就是負(fù)責(zé)處理異常。

例子三

當(dāng)捕獲到異常后,程序的運(yùn)行過(guò)程會(huì)怎樣?

public class Test2 {
    public static void main(String[] args){
        try{
            for (int i = 0; i< 2; i++){
                System.out.print(i + " ");
                System.out.println(1/0);//exception being thrown from here.Then it wil jump directly to the corresponding catch block.
                System.out.println("This line is supposed to be ignored");
            }
        }
        //handling the exception.
        catch(Exception ex){
            System.out.println("Exception handling...");
        }
        System.out.println("End of the main()");
    }
}

運(yùn)行結(jié)果:

0 exception handling...
End of the main()

當(dāng)for不可能循環(huán)到i = 2;因?yàn)樵?b>i = 1時(shí)已經(jīng)拋出了異常。只要產(chǎn)生了異常,轉(zhuǎn)入對(duì)應(yīng)的catch(type ex){...}catch(type ex)必須在參數(shù)里面說(shuō)明捕獲的對(duì)象是哪類(lèi)型的。
throw語(yǔ)句就像一個(gè)調(diào)用函數(shù),當(dāng)程序運(yùn)行中拋出了一個(gè)異常對(duì)象,就會(huì)調(diào)用對(duì)應(yīng)的catch(type ex){}來(lái)處理。但它又不像調(diào)用函數(shù)。因?yàn)樵谡{(diào)用完后,它不會(huì)返回到throw語(yǔ)句,而是接著catch之后的語(yǔ)句。所以System.out.println("This line is supposed to be ignored");這條語(yǔ)句被沒(méi)有執(zhí)行;for循環(huán)也相當(dāng)于被中斷了。

Java的異常處理語(yǔ)句

拋出異常

throw 異常對(duì)象;

捕獲異常

try{
    語(yǔ)句組
}
catch(異常類(lèi)名 異常形式參數(shù)名){
    異常處理語(yǔ)句組; 
}
catch(異常類(lèi)名 異常形式參數(shù)名){
    異常處理語(yǔ)句組; 
}
finally{
    異常處理語(yǔ)句組;
}

其中,catch語(yǔ)句可以0至多個(gè),可以沒(méi)有finally語(yǔ)句

異常的分類(lèi)

Throwable

Error: JVM的錯(cuò)誤(一般來(lái)說(shuō),我們很難處理這里異常)

Exception: 異常(重點(diǎn)關(guān)注)
注:一般所說(shuō)的異常,是指Exception及其子類(lèi)

Exception類(lèi)

構(gòu)造方法

public Exception();
public Exception(String message);
Exception(String message, Throwable cause) ;

方法

getMessage()
getCause()
printStackTrace()
代碼 例子一

仍然是沒(méi)有使用Java的異常處理機(jī)制:

import java.util.Scanner;
public class QuotientWithMethod {
    public static int quotient(int num1, int num2){
        if(num2 == 0){
            log("Divisor cannot be zero");
            System.exit(1);
        }
        return num1/num2;
    }
    public static void log(String s){
        System.out.println(s);
    }
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        //prompt user to enter two integers
        int num1 = input.nextInt();
        int num2 = input.nextInt();
        int result = quotient(num1,num2);//調(diào)用函數(shù)
        System.out.println(num1 + "/" + num2 + "is" + result );
    }
}

運(yùn)行結(jié)果

input two numbers:
1 0
Divisor cannot be zero

在沒(méi)用使用異常處理機(jī)制的情況下,出現(xiàn)了異常情況的話,在被調(diào)用的函數(shù)中,處理異常情況——這里是直接退出了程序;

例子二

用異常處理機(jī)制的好處是職責(zé)分明:被調(diào)函數(shù)中拋出異常,主調(diào)函數(shù)中負(fù)責(zé)處理異常。

import java.util.Scanner;
public class QuotientWithException {
    public static int  quotient(int num1, int num2){
        if(num2 == 0){
            throw new ArithmeticException("Divisor cannot be zero");//用關(guān)鍵字throw拋出異常對(duì)象,這里是調(diào)用構(gòu)造器來(lái)新建對(duì)象
        }//但不做處理
        return num1/num2;
    }
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        System.out.println("input two numbers:");
        int num1 = input.nextInt();
        int num2 = input.nextInt();
        boolean goOn = true;
        do {
            try {
                int result = quotient(num1, num2);
                System.out.println("num1" +"/" + "num2" + "is" +result);
                goOn = false;
            }
            //職責(zé)分明;一個(gè)負(fù)責(zé)拋出異常,一個(gè)負(fù)責(zé)處理異常.
            catch(ArithmeticException ex){
                //在主調(diào)函數(shù)中處理異常
                System.out.println("Exception occur:" + "Divisor cannot be zero. 
 input again,please:");
                num1 = input.nextInt();
                num2 = input.nextInt();
                //int result = quotient(num1, num2);
                //System.out.println("num1" +"/" + "num2" + "is" +result);
            }
        }while(goOn);
        //處理后,進(jìn)入catch{}后的語(yǔ)句.
        System.out.println("End of main().");
    }
}

運(yùn)行結(jié)果

input two numbers:
1 0
Exception occur:Divisor cannot be zero. 
 input again,please:
1 1
num1/num2is1
End of main().

在被調(diào)函數(shù)中,只負(fù)責(zé)拋出異常:throw new ArithmeticException("Divisor cannot be zero");,主調(diào)函數(shù)中catch(ArithmeticException ex){...}指定將要捕獲的對(duì)象的類(lèi)型,并做相應(yīng)的處理,這里要求重新輸入。

多異常的處理

子類(lèi)異常要排在父類(lèi)異常的前面,也就是先處理具體的異常,后處理抽象的異常。

finally語(yǔ)句,無(wú)論是否有異常都要執(zhí)行,即使其中有break,return等語(yǔ)句

在編譯時(shí),finally部分代碼生成了多遍

Exception分兩種

RuntimeException及其子類(lèi),可以不明確處理;否則,稱(chēng)為受檢的異常(checked Exception)

RuntimeException, Error, and their subclasses are known as unchecked exceptions. All other exceptions are known as checked exceptions, meaning that the compiler forces the programmer to check and deal with them in a try-catch block or declare it in the method header.--Introduction to Java

對(duì)于受檢的異常(checked Exception),要求明確進(jìn)行語(yǔ)法處理:

要么捕(catch)

要么拋(throws):在方法的簽名后面用throws xxxx來(lái)聲明

在子類(lèi)中,如果要覆蓋父類(lèi)的一個(gè)方法,若父類(lèi)中的方法聲明了 throws異常,則子類(lèi)的方法也可以throws異常

可以拋出子類(lèi)異常(更具體的異常),但不能拋出更一般的異常

自定義異常類(lèi)

創(chuàng)建用戶(hù)自定義異常時(shí)

繼承自Exception類(lèi)或某個(gè)子Exception類(lèi)

定義屬性和方法,或重載父類(lèi)的方法

這樣getMessage(), toString(), printStackTrace()都會(huì)從Exception繼承下來(lái)。

重拋異常及異常鏈接( Chained Exceptions)

對(duì)于異常,不僅要進(jìn)行捕獲處理,有時(shí)候還需要將此異常進(jìn)一步傳遞給調(diào)用者,以 便讓調(diào)用者也能感受到這種異常。這時(shí)可以在catch語(yǔ)句塊或finally語(yǔ)句塊中采取,以下三種方式:

將當(dāng)前捕獲的異常再次拋出:
throw e;

重新生成一個(gè)異常,并拋出,如:
throw new Exception("some message");

重新生成并拋出一個(gè)新異常,該異常中包含了當(dāng)前異常的信息,如:throw new Exception("some message",e);e.getCause() 來(lái)得到內(nèi)部異常

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65915.html

相關(guān)文章

  • 16.java異常處理

    摘要:不受檢查異常為編譯器不要求強(qiáng)制處理的異常,檢查異常則是編譯器要求必須處置的異常。潛在的異常處理器是異常發(fā)生時(shí)依次存留在調(diào)用棧中的方法的集合。當(dāng)運(yùn)行時(shí)系統(tǒng)遍歷調(diào)用棧而未找到合適的異常處理器,則運(yùn)行時(shí)系統(tǒng)終止。異常處理涉及到五個(gè)關(guān)鍵字,分別是。 概念 程序運(yùn)行時(shí),發(fā)生的不被期望的事件,它阻止了程序按照程序員的預(yù)期正常執(zhí)行,這就是異常。 異常是程序中的一些錯(cuò)誤,但并不是所有的錯(cuò)誤都是異常,并...

    asce1885 評(píng)論0 收藏0
  • Java異常處理

    摘要:異常也就是指程序運(yùn)行時(shí)發(fā)生錯(cuò)誤,而異常處理就是對(duì)這些錯(cuò)誤進(jìn)行處理和控制。有兩個(gè)重要的子類(lèi)異常和錯(cuò)誤,二者都是異常處理的重要子類(lèi),各自都包含大量子類(lèi)。需要注意的是,一旦某個(gè)捕獲到匹配的異常類(lèi)型,將進(jìn)入異常處理代碼。 1,異常現(xiàn)象 程序錯(cuò)誤分為三種:1,編譯錯(cuò)誤;2,運(yùn)行時(shí)錯(cuò)誤;3,邏輯錯(cuò)誤。 編譯錯(cuò)誤是因?yàn)槌绦驔](méi)有遵循語(yǔ)法規(guī)則,編譯程序能夠自己發(fā)現(xiàn)并且提示我們錯(cuò)誤的原因和位置,這...

    CarlBenjamin 評(píng)論0 收藏0
  • Java異常處理

    摘要:可以被異常處理機(jī)制使用,是異常處理的核心。非檢測(cè)異常,在編譯時(shí),不會(huì)提示和發(fā)現(xiàn)異常的存在,不強(qiáng)制要求程序員處理這樣的異常。總體來(lái)說(shuō),語(yǔ)言的異常處理流程,從程序中獲取異常信息。處理運(yùn)行時(shí)異常,采用邏輯合理規(guī)避同時(shí)輔助處理。 目錄 什么是Java異常? 當(dāng)一個(gè)Exception在程序中發(fā)生的時(shí)候,JVM是怎么做的呢? 當(dāng)我們編寫(xiě)程序的時(shí)候如何對(duì)待可能出現(xiàn)的異常呢? 正文 1. 什么是J...

    Fourierr 評(píng)論0 收藏0
  • Java 異常處理

    摘要:下面是異常處理機(jī)制的語(yǔ)法結(jié)構(gòu)業(yè)務(wù)實(shí)現(xiàn)代碼輸入不合法如果執(zhí)行塊里業(yè)務(wù)邏輯代碼時(shí)出現(xiàn)異常,系統(tǒng)自動(dòng)生成一個(gè)異常對(duì)象,該對(duì)象被提交給運(yùn)行時(shí)環(huán)境,這個(gè)過(guò)程被稱(chēng)為拋出異常。 Java的異常機(jī)制主要依賴(lài)于try、catch、finally、throw和throws五個(gè)關(guān)鍵字, try關(guān)鍵字后緊跟一個(gè)花括號(hào)括起來(lái)的代碼塊(花括號(hào)不可省略),簡(jiǎn)稱(chēng)try塊,它里面放置可能引發(fā)異常的代碼 catch后對(duì)...

    senntyou 評(píng)論0 收藏0
  • java異常處理機(jī)制的理解

    摘要:根據(jù)異常對(duì)象判斷是否存在異常處理。否則,范圍小的異常會(huì)因異常處理完成而無(wú)法處理。異常處理中使用作為異常的統(tǒng)一出口。 參考《第一行代碼java》《java程序設(shè)計(jì)教程》java中程序的錯(cuò)誤有語(yǔ)法錯(cuò)誤、語(yǔ)義錯(cuò)誤。如果是語(yǔ)法性錯(cuò)誤,在編譯時(shí)就可以檢查出來(lái)并解決。語(yǔ)義錯(cuò)誤是在程序運(yùn)行時(shí)出現(xiàn)的,在編譯時(shí)沒(méi)有錯(cuò)誤,但在運(yùn)行時(shí)可能會(huì)出現(xiàn)錯(cuò)誤導(dǎo)致程序退出,這些錯(cuò)誤稱(chēng)為異常。在沒(méi)有異常處理的情況下,也即...

    khs1994 評(píng)論0 收藏0
  • Java異常處理 10 個(gè)最佳實(shí)踐

    摘要:為可恢復(fù)的錯(cuò)誤使用檢查型異常,為編程錯(cuò)誤使用非檢查型錯(cuò)誤。檢查型異常保證你對(duì)錯(cuò)誤條件提供異常處理代碼,這是一種從語(yǔ)言到強(qiáng)制你編寫(xiě)健壯的代碼的一種方式,但同時(shí)會(huì)引入大量雜亂的代碼并導(dǎo)致其不可讀。在編程中選擇檢查型異常還是運(yùn)行時(shí)異常。 異常處理是Java 開(kāi)發(fā)中的一個(gè)重要部分。它是關(guān)乎每個(gè)應(yīng)用的一個(gè)非功能性需求,是為了處理任何錯(cuò)誤狀況,比如資源不可訪問(wèn),非法輸入,空輸入等等。Java提供了...

    Forelax 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<