成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java異常處理

CarlBenjamin / 2850人閱讀

摘要:異常也就是指程序運(yùn)行時(shí)發(fā)生錯(cuò)誤,而異常處理就是對(duì)這些錯(cuò)誤進(jìn)行處理和控制。有兩個(gè)重要的子類異常和錯(cuò)誤,二者都是異常處理的重要子類,各自都包含大量子類。需要注意的是,一旦某個(gè)捕獲到匹配的異常類型,將進(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ò)誤的原因和位置,這個(gè)也是大家在剛接觸編程語(yǔ)言最常遇到的問(wèn)題。
  運(yùn)行時(shí)錯(cuò)誤是因?yàn)槌绦蛟趫?zhí)行時(shí),運(yùn)行環(huán)境發(fā)現(xiàn)了不能執(zhí)行的操作。
  邏輯錯(cuò)誤是因?yàn)槌绦驔](méi)有按照預(yù)期的邏輯順序執(zhí)行。異常也就是指程序運(yùn)行時(shí)發(fā)生錯(cuò)誤,而異常處理就是對(duì)這些錯(cuò)誤進(jìn)行處理和控制。      
 
2,java異常類

Java異常類層次結(jié)構(gòu)圖:

  在 Java 中,所有的異常都有一個(gè)共同的祖先java.lang包中的 **Throwable類**。Throwable: 有兩個(gè)重要的子類:**Exception(異常)**和 **Error(錯(cuò)誤)**,二者都是 Java 異常處理的重要子類,各自都包含大量子類。

Error(錯(cuò)誤):是程序無(wú)法處理的錯(cuò)誤,表示運(yùn)行應(yīng)用程序中較嚴(yán)重問(wèn)題。大多數(shù)錯(cuò)誤與代碼編寫(xiě)者執(zhí)行的操作無(wú)關(guān),而表示代碼運(yùn)行時(shí) JVM(Java 虛擬機(jī))出現(xiàn)的問(wèn)題。例如,Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError),當(dāng) JVM 不再有繼續(xù)執(zhí)行操作所需的內(nèi)存資源時(shí),將出現(xiàn) OutOfMemoryError。這些異常發(fā)生時(shí),Java虛擬機(jī)(JVM)一般會(huì)選擇線程終止。

這些錯(cuò)誤表示故障發(fā)生于虛擬機(jī)自身、或者發(fā)生在虛擬機(jī)試圖執(zhí)行應(yīng)用時(shí),如Java虛擬機(jī)運(yùn)行錯(cuò)誤(Virtual MachineError)、類定義錯(cuò)誤(NoClassDefFoundError)等。這些錯(cuò)誤是不可查的,因?yàn)樗鼈冊(cè)趹?yīng)用程序的控制和處理能力之 外,而且絕大多數(shù)是程序運(yùn)行時(shí)不允許出現(xiàn)的狀況。對(duì)于設(shè)計(jì)合理的應(yīng)用程序來(lái)說(shuō),即使確實(shí)發(fā)生了錯(cuò)誤,本質(zhì)上也不應(yīng)該試圖去處理它所引起的異常狀況。在 Java中,錯(cuò)誤通過(guò)Error的子類描述。

Exception(異常):是程序本身可以處理的異常。Exception 類有一個(gè)重要的子類 RuntimeException。RuntimeException 異常由Java虛擬機(jī)拋出。NullPointerException(要訪問(wèn)的變量沒(méi)有引用任何對(duì)象時(shí),拋出該異常)、ArithmeticException(算術(shù)運(yùn)算異常,一個(gè)整數(shù)除以0時(shí),拋出該異常)和 ArrayIndexOutOfBoundsException (下標(biāo)越界異常)。

注意:異常和錯(cuò)誤的區(qū)別:異常能被程序本身可以處理,錯(cuò)誤是無(wú)法處理。

通常,Java的異常(包括Exception和Error)分為可查的異常(checked exceptions)和不可查的異常(unchecked exceptions)。

可查異常(編譯器要求必須處置的異常):正確的程序在運(yùn)行中,很容易出現(xiàn)的、情理可容的異常狀況??刹楫惓km然是異常狀況,但在一定程度上它的發(fā)生是可以預(yù)計(jì)的,而且一旦發(fā)生這種異常狀況,就必須采取某種方式進(jìn)行處理。

除了RuntimeException及其子類以外,其他的Exception類及其子類都屬于可查異常。這種異常的特點(diǎn)是Java編譯器會(huì)檢查它,也就是說(shuō),當(dāng)程序中可能出現(xiàn)這類異常,要么用try-catch語(yǔ)句捕獲它,要么用throws子句聲明拋出它,否則編譯不會(huì)通過(guò)。

不可查異常(編譯器不要求強(qiáng)制處置的異常):包括運(yùn)行時(shí)異常(RuntimeException與其子類)和錯(cuò)誤(Error)。

Exception 這種異常分兩大類運(yùn)行時(shí)異常和非運(yùn)行時(shí)異常(編譯異常)。程序中應(yīng)當(dāng)盡可能去處理這些異常。

運(yùn)行時(shí)異常:都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標(biāo)越界異常)等,這些異常是不檢查異常,程序中可以選擇捕獲處理,也可以不處理。這些異常一般是由程序邏輯錯(cuò)誤引起的,程序應(yīng)該從邏輯角度盡可能避免這類異常的發(fā)生。

運(yùn)行時(shí)異常的特點(diǎn)是Java編譯器不會(huì)檢查它,也就是說(shuō),當(dāng)程序中可能出現(xiàn)這類異常,即使沒(méi)有用try-catch語(yǔ)句捕獲它,也沒(méi)有用throws子句聲明拋出它,也會(huì)編譯通過(guò)。

非運(yùn)行時(shí)異常 (編譯異常):是RuntimeException以外的異常,類型上都屬于Exception類及其子類。從程序語(yǔ)法角度講是必須進(jìn)行處理的異常,如果不處理,程序就不能編譯通過(guò)。如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不自定義檢查異常。

Trowable類常用方法:

public string getMessage():返回異常發(fā)生時(shí)的詳細(xì)信息
public string toString():返回異常發(fā)生時(shí)的簡(jiǎn)要描述
public string getLocalizedMessage():返回異常對(duì)象的本地化信息。使用Throwable的子類覆蓋這個(gè)方法,可以聲稱本地化信息。如果子類沒(méi)有覆蓋該方法,則該方法返回的信息與getMessage()返回的結(jié)果相同
public void printStackTrace():在控制臺(tái)上打印Throwable對(duì)象封裝的異常信息

Java常見(jiàn)異常 1. runtimeException子類:
    1、 java.lang.ArrayIndexOutOfBoundsException

    數(shù)組索引越界異常。當(dāng)對(duì)數(shù)組的索引值為負(fù)數(shù)或大于等于數(shù)組大小時(shí)拋出。

    2、java.lang.ArithmeticException

    算術(shù)條件異常。譬如:整數(shù)除零等。

    3、java.lang.NullPointerException

    空指針異常。當(dāng)應(yīng)用試圖在要求使用對(duì)象的地方使用了null時(shí),拋出該異常。譬如:調(diào)用null對(duì)象的實(shí)例方法、訪問(wèn)null對(duì)象的屬性、計(jì)算null對(duì)象的長(zhǎng)度、使用throw語(yǔ)句拋出null等等

    4、java.lang.ClassNotFoundException

    找不到類異常。當(dāng)應(yīng)用試圖根據(jù)字符串形式的類名構(gòu)造類,而在遍歷CLASSPAH之后找不到對(duì)應(yīng)名稱的class文件時(shí),拋出該異常。

   5、java.lang.NegativeArraySizeException  數(shù)組長(zhǎng)度為負(fù)異常

   6、java.lang.ArrayStoreException 數(shù)組中包含不兼容的值拋出的異常

   7、java.lang.SecurityException 安全性異常

   8、java.lang.IllegalArgumentException 非法參數(shù)異常
2.IOException
IOException:操作輸入流和輸出流時(shí)可能出現(xiàn)的異常。

EOFException   文件已結(jié)束異常

FileNotFoundException   文件未找到異常
3. 其他
     ClassCastException    類型轉(zhuǎn)換異常類

     ArrayStoreException  數(shù)組中包含不兼容的值拋出的異常

     SQLException   操作數(shù)據(jù)庫(kù)異常類

     NoSuchFieldException   字段未找到異常

     NoSuchMethodException   方法未找到拋出的異常

     NumberFormatException    字符串轉(zhuǎn)換為數(shù)字拋出的異常

     StringIndexOutOfBoundsException 字符串索引超出范圍拋出的異常

     IllegalAccessException  不允許訪問(wèn)某類異常
     
     InstantiationException  當(dāng)應(yīng)用程序試圖使用Class類中的newInstance()方法創(chuàng)建一個(gè)類的實(shí)例,而指定的類對(duì)象無(wú)法被實(shí)例化時(shí),拋出該異常
3,異常處理方法

在 Java 應(yīng)用程序中,異常處理機(jī)制為:拋出異常,捕捉異常

1,聲明和拋出異常

任何代碼都有可能發(fā)生系統(tǒng)錯(cuò)誤(Error)和運(yùn)行時(shí)錯(cuò)誤(RunrimeException),因此在方法聲明時(shí),Java系統(tǒng)不要求顯示的聲明Error和RuntimeException兩種異常類(系統(tǒng)隱含的聲明了這兩種異常類),但是,可以在方法體中拋出這兩種異常對(duì)象。需要注意的是:如果要在方法體中拋出其它異常,必須在方法頭聲明這種異常類。
,聲明異常類的格式
在方法頭中使用throws關(guān)鍵字,例如:
public void myThod throws IOException //這里聲明的異常類是:IOException.
關(guān)鍵字throws指出方法myThod在執(zhí)行時(shí)可能拋出IOException異常(對(duì)象)。如果方法執(zhí)行時(shí)可能拋出多種異常,就可以像實(shí)現(xiàn)多個(gè)接口的一樣,將異常類之間用逗號(hào)隔開(kāi),例如:
public void myThod throws Exception1, Exception2....... ExceptionnN
拋出異常對(duì)象的格式
在方法頭中聲明了異常類后,就應(yīng)該在方法體中拋出一個(gè)與方法頭名中聲明的異常類相一致的對(duì)象。例如:
Throw new TheException();//拋出異常

TheException ex=new TheException();
Throw ex;//拋出異常對(duì)象ex
注意:聲明異常類的關(guān)鍵字是throws,拋出異常對(duì)象的關(guān)鍵字是throw

2,捕獲和處理異常 1.try-catch語(yǔ)句

try {  
    // 可能會(huì)發(fā)生異常的程序代碼  
} catch (Type1 id1){  
    // 捕獲并處置try拋出的異常類型Type1  
}  
catch (Type2 id2){  
     //捕獲并處置try拋出的異常類型Type2  
}

注意一個(gè)try語(yǔ)句后面可以跟很多catch語(yǔ)句,catch語(yǔ)句被稱為異常處理器。關(guān)鍵詞try后的一對(duì)大括號(hào)將一塊可能發(fā)生異常的代碼包起來(lái),稱為監(jiān)控區(qū)域。Java方法在運(yùn)行過(guò)程中出現(xiàn)異常,則創(chuàng)建異常對(duì)象。將異常拋出監(jiān)控區(qū)域之 外,由Java運(yùn)行時(shí)系統(tǒng)試圖尋找匹配的catch子句以捕獲異常。若有匹配的catch子句,則運(yùn)行其異常處理代碼,try-catch語(yǔ)句結(jié)束。

匹配的原則是:如果拋出的異常對(duì)象屬于catch子句的異常類,或者屬于該異常類的子類,則認(rèn)為生成的異常對(duì)象與catch塊捕獲的異常類型相匹配
例1 捕捉throw語(yǔ)句拋出的“除數(shù)為0”異常。

public class TestException {  
    public static void main(String[] args) {  
        int a = 6;  
        int b = 0;  
        try { // try監(jiān)控區(qū)域  
               
            if (b == 0) throw new ArithmeticException(); // “除數(shù)為0”等ArithmeticException,是RuntimException的子類。而運(yùn)行時(shí)異常將由運(yùn)行時(shí)系統(tǒng)自動(dòng)拋出,不需要使用throw語(yǔ)句,這里把throw new ArithmeticException()去掉也是不影響運(yùn)行結(jié)果的。
            System.out.println("a/b的值是:" + a / b);  
        }  
        catch (ArithmeticException e) { // catch捕捉異常  
            System.out.println("程序出現(xiàn)異常,變量b不能為0。");  
        }  
        System.out.println("程序正常結(jié)束。");  
    }  
}

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

  在例1中  try監(jiān)控區(qū)域通過(guò)if語(yǔ)句進(jìn)行判斷,當(dāng)“除數(shù)為0”的錯(cuò)誤條件成立時(shí)引發(fā)ArithmeticException異常,創(chuàng)建 ArithmeticException異常對(duì)象,并由throw語(yǔ)句將異常拋給Java運(yùn)行時(shí)系統(tǒng),由系統(tǒng)尋找匹配的異常處理器catch并運(yùn)行相應(yīng)異 常處理代碼,打印輸出“程序出現(xiàn)異常,變量b不能為0?!眛ry-catch語(yǔ)句結(jié)束,繼續(xù)程序流程。
    需要注意的是,一旦某個(gè)catch捕獲到匹配的異常類型,將進(jìn)入異常處理代碼。一經(jīng)處理結(jié)束,就意味著整個(gè)try-catch語(yǔ)句結(jié)束。其他的catch子句不再有匹配和捕獲異常類型的機(jī)會(huì)。

   Java通過(guò)異常類描述異常類型,異常類的層次結(jié)構(gòu)如圖1所示。對(duì)于有多個(gè)catch子句的異常程序而言,應(yīng)該盡量將捕獲底層異常類的catch子 句放在前面,同時(shí)盡量將捕獲相對(duì)高層的異常類的catch子句放在后面。否則,捕獲底層異常類的catch子句將可能會(huì)被屏蔽。

RuntimeException異常類包括運(yùn)行時(shí)各種常見(jiàn)的異常,ArithmeticException類和ArrayIndexOutOfBoundsException類都是它的子類。因此,RuntimeException異常類的catch子句應(yīng)該放在 最后面,否則可能會(huì)屏蔽其后的特定異常處理或引起編譯錯(cuò)誤。

2. try-catch-finally語(yǔ)句

try-catch語(yǔ)句還可以包括第三部分,就是finally子句。它表示無(wú)論是否出現(xiàn)異常,都應(yīng)當(dāng)執(zhí)行的內(nèi)容。try-catch-finally語(yǔ)句的一般語(yǔ)法形式為:

try {  
    // 可能會(huì)發(fā)生異常的程序代碼  
} catch (Type1 id1) {  
    // 捕獲并處理try拋出的異常類型Type1  
} catch (Type2 id2) {  
    // 捕獲并處理try拋出的異常類型Type2  
} finally {  
    // 無(wú)論是否發(fā)生異常,都將執(zhí)行的語(yǔ)句塊  
}

例二, 帶finally子句的異常處理程序

public class TestException {  
    public static void main(String args[]) {  
        int i = 0;  
        String greetings[] = { " Hello world !", " Hello World !! ",  
                " HELLO WORLD !!!" };  
        while (i < 4) {  
            try {  
                // 特別注意循環(huán)控制變量i的設(shè)計(jì),避免造成無(wú)限循環(huán)  
                System.out.println(greetings[i++]);  
            } catch (ArrayIndexOutOfBoundsException e) {  
                System.out.println("數(shù)組下標(biāo)越界異常");  
            } finally {  
                System.out.println("--------------------------");  
            }  
        }  
    }  
}

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

小結(jié):

try 塊:用于捕獲異常。其后可接零個(gè)或多個(gè)catch塊,如果沒(méi)有catch塊,則必須跟一個(gè)finally塊。
catch 塊:用于處理try捕獲到的異常。
finally 塊:無(wú)論是否捕獲或處理異常,finally塊里的語(yǔ)句都會(huì)被執(zhí)行。當(dāng)在try塊或catch塊中遇到return語(yǔ)句時(shí),finally語(yǔ)句塊將在方法返回之前被執(zhí)行。在以下4種特殊情況下,finally塊不會(huì)被執(zhí)行:
1)在finally語(yǔ)句塊中發(fā)生了異常。
2)在前面的代碼中用了System.exit()退出程序。
3)程序所在的線程死亡。
4)關(guān)閉CPU。

4,自定義異常類

雖然Java系統(tǒng)已經(jīng)預(yù)定義好了很多異常類,但是有時(shí)會(huì)遇到預(yù)定義的異常類不能描述出現(xiàn)的錯(cuò)誤。在這種情況下,程序員可以通過(guò)擴(kuò)展Exception類及其子類來(lái)定義自己的異常類
格式如下

1.自定義異常:
class 異常類名 extends Exception 
{ 
    public 異常類名(String msg) 
    { 
        super(msg); 
    } 
}
2.標(biāo)識(shí)可能拋出的異常:
throws 異常類名1,異常類名2 
3.捕獲異常:
try{} 
catch(異常類名 y){} 
catch(異常類名 y){} 
4.方法解釋

getMessage() //輸出異常的信息
printStackTrace() //輸出導(dǎo)致異常更為詳細(xì)的信息
例子
CustomException.java

package me;

class FormatException extends Exception
{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    private String ErrorMessage;
    public FormatException(String message)
    {
        super(message);
        ErrorMessage=message;
    }
    public String getMessage(){
        return "該數(shù)組元素"+ErrorMessage+"不是偶數(shù),不符合";
    }
}
public class CustomException
{
    int A[]={6,7,3,2,5,1};
    public void g(int i)throws FormatException
    {
        System.out.println("一下輸出數(shù)組元素偶數(shù)");
        for(i=0;i<=5;i++)
        {
            if(A[i]%2!=0)
            {
                throw new FormatException(String.valueOf(i));
                
            }
            else System.out.println("A["+i+"]="+A[i]);
        }
    }


public void run(int i){
    try{
        g(i);
    }
    catch(FormatException e)
    {
        e.getMessage();System.out.println(e);
    }
    finally{System.out.println("A["+i+"]="+A[i]);
}
}
}



text.java

package me;

public class Text {

    public static void main(String[] args)
    {
        CustomException a=new CustomException();
        a.run(5);
    }
    
}

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

歡迎關(guān)注我的微信公眾號(hào):"Java面試通關(guān)手冊(cè)"(一個(gè)有溫度的微信公眾號(hào),期待與你共同進(jìn)步~~~堅(jiān)持原創(chuàng),分享美文,分享各種Java學(xué)習(xí)資源):

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69450.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異常處理

    摘要:可以被異常處理機(jī)制使用,是異常處理的核心。非檢測(cè)異常,在編譯時(shí),不會(huì)提示和發(fā)現(xiàn)異常的存在,不強(qiáng)制要求程序員處理這樣的異常??傮w來(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ò)程被稱為拋出異常。 Java的異常機(jī)制主要依賴于try、catch、finally、throw和throws五個(gè)關(guān)鍵字, try關(guān)鍵字后緊跟一個(gè)花括號(hào)括起來(lái)的代碼塊(花括號(hào)不可省略),簡(jiǎn)稱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ò)誤稱為異常。在沒(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元查看
<