前沿拓展:
buffer overrun
可能是軟件被損壞了 重下一遍 還不行可能就是軟件沖突 **的問題了
Java異常的理解?
異常主要處理編譯期不能捕獲的錯(cuò)誤。出現(xiàn)問題時(shí)能繼續(xù)順利執(zhí)行下去,而不導(dǎo)致程序終止。確保程序的健壯性。Throwable 是所有 Java 程序中錯(cuò)誤處理的父類 ,有兩個(gè)子類:Error 和 Exception 。
未檢查異常和已檢查異常所有派生自Error和RuntimeException的類,都是未檢查異常.其余的是已檢查異常.未檢查異常意思就是說,編譯器不會(huì)檢查程序是否拋出異常,換句話說,程序員可以不用使用try-catch來捕獲異常,比如NullPointerException
Error :是程序無法處理的錯(cuò)誤,表示運(yùn)行應(yīng)用程序中較嚴(yán)重問題。大多數(shù)錯(cuò)誤與代碼編寫者執(zhí)行的**作無關(guān),而表示代碼運(yùn)行時(shí) JVM(Java 虛擬機(jī))出現(xià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)用程序來說,即使確實(shí)發(fā)生了錯(cuò)誤,本質(zhì)上也不應(yīng)該試圖去處理它所引起的異常狀況。在 Java中,錯(cuò)誤通過Error的子類描述。
Exception :表示可恢復(fù)的例外,這是可捕捉到的。
Java 提供了兩類主要的異常 :runtime exception 和 checked exception 。是程序本身可以處理的異常。
Exception 類有一個(gè)重要的子類 RuntimeException。RuntimeException 類及其子類表示“JVM 常用**作”引發(fā)的錯(cuò)誤。例如,若試圖使用空值對(duì)象引用、除數(shù)為零或數(shù)組越界,則分別引發(fā)運(yùn)行時(shí)異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
checked 異常也就是我們經(jīng)常遇到的 IO 異常,以及 SQL 異常都是這種異常。java編譯器強(qiáng)制要求catch此類異常. 對(duì)于這種異常, JAVA 編譯器強(qiáng)制要求我們必需對(duì)出現(xiàn)的這些異常進(jìn)行 catch 。所以,面對(duì)這種異常不管我們是否愿意,只能自己去寫一大堆 catch 塊去處理可能的異常。
只有java語言提供了Checked異常,Java認(rèn)為Checked異常都是可以被處理的異常,所以Java程序必須顯示處理Checked異常。如果程序沒有處理Checked異常,該程序在編譯時(shí)就會(huì)發(fā)生錯(cuò)誤無法編譯。這體現(xiàn)了Java的設(shè)計(jì)哲學(xué):沒有完善錯(cuò)誤處理的代碼根本沒有機(jī)會(huì)被執(zhí)行。對(duì)Checked異常處理方法有兩種
1 當(dāng)前方法知道如何處理該異常,則用try…catch塊來處理該異常。2 當(dāng)前方法不知道如何處理,則在定義該方法是聲明拋出該異常。
runtime exception ,也稱運(yùn)行時(shí)異常,我們可以不處理。當(dāng)出現(xiàn)這樣的異常時(shí),總是由虛擬機(jī)接管。比如:我們從來沒有人去處理過 NullPointerException 異常,它就是運(yùn)行時(shí)異常,并且這種異常還是最常見的異常之一。
出現(xiàn)運(yùn)行時(shí)異常后,系統(tǒng)會(huì)把異常一直往上層拋,一直遇到處理代碼。如果沒有處理塊,到最上層,如果是多線程就由 Thread.run() 拋出 ,如果是單線程就被 main() 拋出 。拋出之后,如果是線程,這個(gè)線程也就退出了。如果是主程序拋出的異常,那么這整個(gè)程序也就退出了。運(yùn)行時(shí)異常是 Exception 的子類,也有一般異常的特點(diǎn),是可以被 Catch 塊處理的。只不過往往我們不對(duì)他處理罷了。也就是說,你如果不對(duì)運(yùn)行時(shí)異常進(jìn)行處理,那么出現(xiàn)運(yùn)行時(shí)異常之后,要么是線程中止,要么是主程序終止。
如果不想終止,則必須撲捉所有的運(yùn)行時(shí)異常,決不讓這個(gè)處理線程退出。隊(duì)列里面出現(xiàn)異常數(shù)據(jù)了,正常的處理應(yīng)該是把異常數(shù)據(jù)舍棄,第二記錄日志。不應(yīng)該由于異常數(shù)據(jù)而影響下面對(duì)正常數(shù)據(jù)的處理。在這個(gè)場(chǎng)景這樣處理可能是一個(gè)比較好的應(yīng)用,但并不代表在所有的場(chǎng)景你都應(yīng)該如此。
如果在其它場(chǎng)景,遇到了一些錯(cuò)誤,如果退出程序比較好,這時(shí)你就可以不太理會(huì)運(yùn)行時(shí)異常 ,或者是通過對(duì)異常的處理顯式的控制程序退出。
異常處理的目標(biāo)之一就是為了把程序從異常中恢復(fù)出來。
遇到的異常類有哪些NullPointerException:空指針。**作一個(gè) null 對(duì)象的方法或?qū)傩詴r(shí)會(huì)拋出這個(gè)異常。ArrayIndexOutOfBoundsException:數(shù)組越界。IllegalArgumentException:參數(shù)非法。BufferOverflowException:緩存溢出。ClassNotFoundException:在編譯時(shí)無法找到指定的類。ClassCastException:類型強(qiáng)轉(zhuǎn)。java類型轉(zhuǎn)換錯(cuò)誤異常ExceptionInInitializerError:靜態(tài)初始值或靜態(tài)變量初始值期間發(fā)生異常。UnsatisfiedLinkError:JNI加載dll或者so文件時(shí)未找到。NoClassDefFoundError:在編譯時(shí)能找到合適的類,而在運(yùn)行時(shí)不能找到合適的類。OutofOutofMemoryError內(nèi)存出現(xiàn)異常的一種異常,這不是程序能控制的,是指要分配的對(duì)象的內(nèi)存超出了當(dāng)前最大的堆內(nèi)存,需要調(diào)整堆內(nèi)存大?。?Xmx)以及優(yōu)化程序。Exception和Error的區(qū)別
Exception:
1.可以是可被控制(checked) 或不可控制的(unchecked)
2.表示一個(gè)由程序員導(dǎo)致的錯(cuò)誤
3.應(yīng)該在應(yīng)用程序級(jí)被處理
Error:
1.總是不可控制的(unchecked)
2.經(jīng)常用來用于表示系統(tǒng)錯(cuò)誤或低層資源的錯(cuò)誤
3.如何可能的話,應(yīng)該在系統(tǒng)級(jí)被捕捉
需要注意的地方
1、try塊中的局部變量和catch塊中的局部變量(包括異常變量),以及finally中的局部變量,他們之間不可共享使用。
2、每一個(gè)catch塊用于處理一個(gè)異常。異常匹配是按照catch塊的順序從上往下尋找的,只有第一個(gè)匹配的catch會(huì)得到執(zhí)行。匹配時(shí),不僅運(yùn)行精確匹配,也支持父類匹配,因此,如果同一個(gè)try塊下的多個(gè)catch異常類型有父子關(guān)系,應(yīng)該將子類異常放在前面,父類異常放在后面,這樣保證每個(gè)catch塊都有存在的意義。
3、java中,異常處理的任務(wù)就是將執(zhí)行控制流從異常發(fā)生的地方轉(zhuǎn)移到能夠處理這種異常的地方去。也就是說:當(dāng)一個(gè)函數(shù)的某條語句發(fā)生異常時(shí),這條語句的后面的語句不會(huì)再執(zhí)行,它失去了焦點(diǎn)。執(zhí)行流跳轉(zhuǎn)到最近的匹配的異常處理catch代碼塊去執(zhí)行,異常被處理完后,執(zhí)行流會(huì)接著在“處理了這個(gè)異常的catch代碼塊”后面接著執(zhí)行。有的編程語言當(dāng)異常被處理后,控制流會(huì)恢復(fù)到異常拋出點(diǎn)接著執(zhí)行,這種策略叫做:resumption model of exception handling(恢復(fù)式異常處理模式 )而Java則是讓執(zhí)行流恢復(fù)到處理了異常的catch塊后接著執(zhí)行,這種策略叫做:termination model of exception handling(終結(jié)式異常處理模式)
如過我們遇到了運(yùn)行時(shí)異常應(yīng)該盡早可能的使用IDE提示的信息**到異常位置并處理,但是有些異常很難查到,如果想對(duì)異常得心應(yīng)手那么只有增加工作經(jīng)驗(yàn)多遇到異常多處理第二小編綜合來說出現(xiàn)異常的原因及處理手段確保下次不會(huì)遇到,就算遇到也能很快**到位置,還有另一種就是我們?cè)陧?xiàng)目中常常強(qiáng)調(diào)敏捷開發(fā),要確保一定的時(shí)間內(nèi)能夠讓項(xiàng)目更快的上線,這使得不少程序員經(jīng)常在一些開源社區(qū)中尋找合適的框架,但由于這些框架不是自己寫的所以框架產(chǎn)生的一些異常(最常見的是編譯時(shí)異常,托到項(xiàng)目就見紅)很難查,而且作者經(jīng)常不在線。在選擇開源框架時(shí)應(yīng)該選擇一些名氣比較大的,遇到異常網(wǎng)上能夠快速搜索得到的。
拓展知識(shí):
前沿拓展:
buffer overrun
可能是軟件被損壞了 重下一遍 還不行可能就是軟件沖突 **的問題了
Java異常的理解?
異常主要處理編譯期不能捕獲的錯(cuò)誤。出現(xiàn)問題時(shí)能繼續(xù)順利執(zhí)行下去,而不導(dǎo)致程序終止。確保程序的健壯性。Throwable 是所有 Java 程序中錯(cuò)誤處理的父類 ,有兩個(gè)子類:Error 和 Exception 。
未檢查異常和已檢查異常所有派生自Error和RuntimeException的類,都是未檢查異常.其余的是已檢查異常.未檢查異常意思就是說,編譯器不會(huì)檢查程序是否拋出異常,換句話說,程序員可以不用使用try-catch來捕獲異常,比如NullPointerException
Error :是程序無法處理的錯(cuò)誤,表示運(yùn)行應(yīng)用程序中較嚴(yán)重問題。大多數(shù)錯(cuò)誤與代碼編寫者執(zhí)行的**作無關(guān),而表示代碼運(yùn)行時(shí) JVM(Java 虛擬機(jī))出現(xià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)用程序來說,即使確實(shí)發(fā)生了錯(cuò)誤,本質(zhì)上也不應(yīng)該試圖去處理它所引起的異常狀況。在 Java中,錯(cuò)誤通過Error的子類描述。
Exception :表示可恢復(fù)的例外,這是可捕捉到的。
Java 提供了兩類主要的異常 :runtime exception 和 checked exception 。是程序本身可以處理的異常。
Exception 類有一個(gè)重要的子類 RuntimeException。RuntimeException 類及其子類表示“JVM 常用**作”引發(fā)的錯(cuò)誤。例如,若試圖使用空值對(duì)象引用、除數(shù)為零或數(shù)組越界,則分別引發(fā)運(yùn)行時(shí)異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
checked 異常也就是我們經(jīng)常遇到的 IO 異常,以及 SQL 異常都是這種異常。java編譯器強(qiáng)制要求catch此類異常. 對(duì)于這種異常, JAVA 編譯器強(qiáng)制要求我們必需對(duì)出現(xiàn)的這些異常進(jìn)行 catch 。所以,面對(duì)這種異常不管我們是否愿意,只能自己去寫一大堆 catch 塊去處理可能的異常。
只有java語言提供了Checked異常,Java認(rèn)為Checked異常都是可以被處理的異常,所以Java程序必須顯示處理Checked異常。如果程序沒有處理Checked異常,該程序在編譯時(shí)就會(huì)發(fā)生錯(cuò)誤無法編譯。這體現(xiàn)了Java的設(shè)計(jì)哲學(xué):沒有完善錯(cuò)誤處理的代碼根本沒有機(jī)會(huì)被執(zhí)行。對(duì)Checked異常處理方法有兩種
1 當(dāng)前方法知道如何處理該異常,則用try…catch塊來處理該異常。2 當(dāng)前方法不知道如何處理,則在定義該方法是聲明拋出該異常。
runtime exception ,也稱運(yùn)行時(shí)異常,我們可以不處理。當(dāng)出現(xiàn)這樣的異常時(shí),總是由虛擬機(jī)接管。比如:我們從來沒有人去處理過 NullPointerException 異常,它就是運(yùn)行時(shí)異常,并且這種異常還是最常見的異常之一。
出現(xiàn)運(yùn)行時(shí)異常后,系統(tǒng)會(huì)把異常一直往上層拋,一直遇到處理代碼。如果沒有處理塊,到最上層,如果是多線程就由 Thread.run() 拋出 ,如果是單線程就被 main() 拋出 。拋出之后,如果是線程,這個(gè)線程也就退出了。如果是主程序拋出的異常,那么這整個(gè)程序也就退出了。運(yùn)行時(shí)異常是 Exception 的子類,也有一般異常的特點(diǎn),是可以被 Catch 塊處理的。只不過往往我們不對(duì)他處理罷了。也就是說,你如果不對(duì)運(yùn)行時(shí)異常進(jìn)行處理,那么出現(xiàn)運(yùn)行時(shí)異常之后,要么是線程中止,要么是主程序終止。
如果不想終止,則必須撲捉所有的運(yùn)行時(shí)異常,決不讓這個(gè)處理線程退出。隊(duì)列里面出現(xiàn)異常數(shù)據(jù)了,正常的處理應(yīng)該是把異常數(shù)據(jù)舍棄,第二記錄日志。不應(yīng)該由于異常數(shù)據(jù)而影響下面對(duì)正常數(shù)據(jù)的處理。在這個(gè)場(chǎng)景這樣處理可能是一個(gè)比較好的應(yīng)用,但并不代表在所有的場(chǎng)景你都應(yīng)該如此。
如果在其它場(chǎng)景,遇到了一些錯(cuò)誤,如果退出程序比較好,這時(shí)你就可以不太理會(huì)運(yùn)行時(shí)異常 ,或者是通過對(duì)異常的處理顯式的控制程序退出。
異常處理的目標(biāo)之一就是為了把程序從異常中恢復(fù)出來。
遇到的異常類有哪些NullPointerException:空指針。**作一個(gè) null 對(duì)象的方法或?qū)傩詴r(shí)會(huì)拋出這個(gè)異常。ArrayIndexOutOfBoundsException:數(shù)組越界。IllegalArgumentException:參數(shù)非法。BufferOverflowException:緩存溢出。ClassNotFoundException:在編譯時(shí)無法找到指定的類。ClassCastException:類型強(qiáng)轉(zhuǎn)。java類型轉(zhuǎn)換錯(cuò)誤異常ExceptionInInitializerError:靜態(tài)初始值或靜態(tài)變量初始值期間發(fā)生異常。UnsatisfiedLinkError:JNI加載dll或者so文件時(shí)未找到。NoClassDefFoundError:在編譯時(shí)能找到合適的類,而在運(yùn)行時(shí)不能找到合適的類。OutofOutofMemoryError內(nèi)存出現(xiàn)異常的一種異常,這不是程序能控制的,是指要分配的對(duì)象的內(nèi)存超出了當(dāng)前最大的堆內(nèi)存,需要調(diào)整堆內(nèi)存大?。?Xmx)以及優(yōu)化程序。Exception和Error的區(qū)別
Exception:
1.可以是可被控制(checked) 或不可控制的(unchecked)
2.表示一個(gè)由程序員導(dǎo)致的錯(cuò)誤
3.應(yīng)該在應(yīng)用程序級(jí)被處理
Error:
1.總是不可控制的(unchecked)
2.經(jīng)常用來用于表示系統(tǒng)錯(cuò)誤或低層資源的錯(cuò)誤
3.如何可能的話,應(yīng)該在系統(tǒng)級(jí)被捕捉
需要注意的地方
1、try塊中的局部變量和catch塊中的局部變量(包括異常變量),以及finally中的局部變量,他們之間不可共享使用。
2、每一個(gè)catch塊用于處理一個(gè)異常。異常匹配是按照catch塊的順序從上往下尋找的,只有第一個(gè)匹配的catch會(huì)得到執(zhí)行。匹配時(shí),不僅運(yùn)行精確匹配,也支持父類匹配,因此,如果同一個(gè)try塊下的多個(gè)catch異常類型有父子關(guān)系,應(yīng)該將子類異常放在前面,父類異常放在后面,這樣保證每個(gè)catch塊都有存在的意義。
3、java中,異常處理的任務(wù)就是將執(zhí)行控制流從異常發(fā)生的地方轉(zhuǎn)移到能夠處理這種異常的地方去。也就是說:當(dāng)一個(gè)函數(shù)的某條語句發(fā)生異常時(shí),這條語句的后面的語句不會(huì)再執(zhí)行,它失去了焦點(diǎn)。執(zhí)行流跳轉(zhuǎn)到最近的匹配的異常處理catch代碼塊去執(zhí)行,異常被處理完后,執(zhí)行流會(huì)接著在“處理了這個(gè)異常的catch代碼塊”后面接著執(zhí)行。有的編程語言當(dāng)異常被處理后,控制流會(huì)恢復(fù)到異常拋出點(diǎn)接著執(zhí)行,這種策略叫做:resumption model of exception handling(恢復(fù)式異常處理模式 )而Java則是讓執(zhí)行流恢復(fù)到處理了異常的catch塊后接著執(zhí)行,這種策略叫做:termination model of exception handling(終結(jié)式異常處理模式)
如過我們遇到了運(yùn)行時(shí)異常應(yīng)該盡早可能的使用IDE提示的信息**到異常位置并處理,但是有些異常很難查到,如果想對(duì)異常得心應(yīng)手那么只有增加工作經(jīng)驗(yàn)多遇到異常多處理第二小編綜合來說出現(xiàn)異常的原因及處理手段確保下次不會(huì)遇到,就算遇到也能很快**到位置,還有另一種就是我們?cè)陧?xiàng)目中常常強(qiáng)調(diào)敏捷開發(fā),要確保一定的時(shí)間內(nèi)能夠讓項(xiàng)目更快的上線,這使得不少程序員經(jīng)常在一些開源社區(qū)中尋找合適的框架,但由于這些框架不是自己寫的所以框架產(chǎn)生的一些異常(最常見的是編譯時(shí)異常,托到項(xiàng)目就見紅)很難查,而且作者經(jīng)常不在線。在選擇開源框架時(shí)應(yīng)該選擇一些名氣比較大的,遇到異常網(wǎng)上能夠快速搜索得到的。
拓展知識(shí):
前沿拓展:
buffer overrun
可能是軟件被損壞了 重下一遍 還不行可能就是軟件沖突 **的問題了
Java異常的理解?
異常主要處理編譯期不能捕獲的錯(cuò)誤。出現(xiàn)問題時(shí)能繼續(xù)順利執(zhí)行下去,而不導(dǎo)致程序終止。確保程序的健壯性。Throwable 是所有 Java 程序中錯(cuò)誤處理的父類 ,有兩個(gè)子類:Error 和 Exception 。
未檢查異常和已檢查異常所有派生自Error和RuntimeException的類,都是未檢查異常.其余的是已檢查異常.未檢查異常意思就是說,編譯器不會(huì)檢查程序是否拋出異常,換句話說,程序員可以不用使用try-catch來捕獲異常,比如NullPointerException
Error :是程序無法處理的錯(cuò)誤,表示運(yùn)行應(yīng)用程序中較嚴(yán)重問題。大多數(shù)錯(cuò)誤與代碼編寫者執(zhí)行的**作無關(guān),而表示代碼運(yùn)行時(shí) JVM(Java 虛擬機(jī))出現(xià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)用程序來說,即使確實(shí)發(fā)生了錯(cuò)誤,本質(zhì)上也不應(yīng)該試圖去處理它所引起的異常狀況。在 Java中,錯(cuò)誤通過Error的子類描述。
Exception :表示可恢復(fù)的例外,這是可捕捉到的。
Java 提供了兩類主要的異常 :runtime exception 和 checked exception 。是程序本身可以處理的異常。
Exception 類有一個(gè)重要的子類 RuntimeException。RuntimeException 類及其子類表示“JVM 常用**作”引發(fā)的錯(cuò)誤。例如,若試圖使用空值對(duì)象引用、除數(shù)為零或數(shù)組越界,則分別引發(fā)運(yùn)行時(shí)異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
checked 異常也就是我們經(jīng)常遇到的 IO 異常,以及 SQL 異常都是這種異常。java編譯器強(qiáng)制要求catch此類異常. 對(duì)于這種異常, JAVA 編譯器強(qiáng)制要求我們必需對(duì)出現(xiàn)的這些異常進(jìn)行 catch 。所以,面對(duì)這種異常不管我們是否愿意,只能自己去寫一大堆 catch 塊去處理可能的異常。
只有java語言提供了Checked異常,Java認(rèn)為Checked異常都是可以被處理的異常,所以Java程序必須顯示處理Checked異常。如果程序沒有處理Checked異常,該程序在編譯時(shí)就會(huì)發(fā)生錯(cuò)誤無法編譯。這體現(xiàn)了Java的設(shè)計(jì)哲學(xué):沒有完善錯(cuò)誤處理的代碼根本沒有機(jī)會(huì)被執(zhí)行。對(duì)Checked異常處理方法有兩種
1 當(dāng)前方法知道如何處理該異常,則用try…catch塊來處理該異常。2 當(dāng)前方法不知道如何處理,則在定義該方法是聲明拋出該異常。
runtime exception ,也稱運(yùn)行時(shí)異常,我們可以不處理。當(dāng)出現(xiàn)這樣的異常時(shí),總是由虛擬機(jī)接管。比如:我們從來沒有人去處理過 NullPointerException 異常,它就是運(yùn)行時(shí)異常,并且這種異常還是最常見的異常之一。
出現(xiàn)運(yùn)行時(shí)異常后,系統(tǒng)會(huì)把異常一直往上層拋,一直遇到處理代碼。如果沒有處理塊,到最上層,如果是多線程就由 Thread.run() 拋出 ,如果是單線程就被 main() 拋出 。拋出之后,如果是線程,這個(gè)線程也就退出了。如果是主程序拋出的異常,那么這整個(gè)程序也就退出了。運(yùn)行時(shí)異常是 Exception 的子類,也有一般異常的特點(diǎn),是可以被 Catch 塊處理的。只不過往往我們不對(duì)他處理罷了。也就是說,你如果不對(duì)運(yùn)行時(shí)異常進(jìn)行處理,那么出現(xiàn)運(yùn)行時(shí)異常之后,要么是線程中止,要么是主程序終止。
如果不想終止,則必須撲捉所有的運(yùn)行時(shí)異常,決不讓這個(gè)處理線程退出。隊(duì)列里面出現(xiàn)異常數(shù)據(jù)了,正常的處理應(yīng)該是把異常數(shù)據(jù)舍棄,第二記錄日志。不應(yīng)該由于異常數(shù)據(jù)而影響下面對(duì)正常數(shù)據(jù)的處理。在這個(gè)場(chǎng)景這樣處理可能是一個(gè)比較好的應(yīng)用,但并不代表在所有的場(chǎng)景你都應(yīng)該如此。
如果在其它場(chǎng)景,遇到了一些錯(cuò)誤,如果退出程序比較好,這時(shí)你就可以不太理會(huì)運(yùn)行時(shí)異常 ,或者是通過對(duì)異常的處理顯式的控制程序退出。
異常處理的目標(biāo)之一就是為了把程序從異常中恢復(fù)出來。
遇到的異常類有哪些NullPointerException:空指針。**作一個(gè) null 對(duì)象的方法或?qū)傩詴r(shí)會(huì)拋出這個(gè)異常。ArrayIndexOutOfBoundsException:數(shù)組越界。IllegalArgumentException:參數(shù)非法。BufferOverflowException:緩存溢出。ClassNotFoundException:在編譯時(shí)無法找到指定的類。ClassCastException:類型強(qiáng)轉(zhuǎn)。java類型轉(zhuǎn)換錯(cuò)誤異常ExceptionInInitializerError:靜態(tài)初始值或靜態(tài)變量初始值期間發(fā)生異常。UnsatisfiedLinkError:JNI加載dll或者so文件時(shí)未找到。NoClassDefFoundError:在編譯時(shí)能找到合適的類,而在運(yùn)行時(shí)不能找到合適的類。OutofOutofMemoryError內(nèi)存出現(xiàn)異常的一種異常,這不是程序能控制的,是指要分配的對(duì)象的內(nèi)存超出了當(dāng)前最大的堆內(nèi)存,需要調(diào)整堆內(nèi)存大?。?Xmx)以及優(yōu)化程序。Exception和Error的區(qū)別
Exception:
1.可以是可被控制(checked) 或不可控制的(unchecked)
2.表示一個(gè)由程序員導(dǎo)致的錯(cuò)誤
3.應(yīng)該在應(yīng)用程序級(jí)被處理
Error:
1.總是不可控制的(unchecked)
2.經(jīng)常用來用于表示系統(tǒng)錯(cuò)誤或低層資源的錯(cuò)誤
3.如何可能的話,應(yīng)該在系統(tǒng)級(jí)被捕捉
需要注意的地方
1、try塊中的局部變量和catch塊中的局部變量(包括異常變量),以及finally中的局部變量,他們之間不可共享使用。
2、每一個(gè)catch塊用于處理一個(gè)異常。異常匹配是按照catch塊的順序從上往下尋找的,只有第一個(gè)匹配的catch會(huì)得到執(zhí)行。匹配時(shí),不僅運(yùn)行精確匹配,也支持父類匹配,因此,如果同一個(gè)try塊下的多個(gè)catch異常類型有父子關(guān)系,應(yīng)該將子類異常放在前面,父類異常放在后面,這樣保證每個(gè)catch塊都有存在的意義。
3、java中,異常處理的任務(wù)就是將執(zhí)行控制流從異常發(fā)生的地方轉(zhuǎn)移到能夠處理這種異常的地方去。也就是說:當(dāng)一個(gè)函數(shù)的某條語句發(fā)生異常時(shí),這條語句的后面的語句不會(huì)再執(zhí)行,它失去了焦點(diǎn)。執(zhí)行流跳轉(zhuǎn)到最近的匹配的異常處理catch代碼塊去執(zhí)行,異常被處理完后,執(zhí)行流會(huì)接著在“處理了這個(gè)異常的catch代碼塊”后面接著執(zhí)行。有的編程語言當(dāng)異常被處理后,控制流會(huì)恢復(fù)到異常拋出點(diǎn)接著執(zhí)行,這種策略叫做:resumption model of exception handling(恢復(fù)式異常處理模式 )而Java則是讓執(zhí)行流恢復(fù)到處理了異常的catch塊后接著執(zhí)行,這種策略叫做:termination model of exception handling(終結(jié)式異常處理模式)
如過我們遇到了運(yùn)行時(shí)異常應(yīng)該盡早可能的使用IDE提示的信息**到異常位置并處理,但是有些異常很難查到,如果想對(duì)異常得心應(yīng)手那么只有增加工作經(jīng)驗(yàn)多遇到異常多處理第二小編綜合來說出現(xiàn)異常的原因及處理手段確保下次不會(huì)遇到,就算遇到也能很快**到位置,還有另一種就是我們?cè)陧?xiàng)目中常常強(qiáng)調(diào)敏捷開發(fā),要確保一定的時(shí)間內(nèi)能夠讓項(xiàng)目更快的上線,這使得不少程序員經(jīng)常在一些開源社區(qū)中尋找合適的框架,但由于這些框架不是自己寫的所以框架產(chǎn)生的一些異常(最常見的是編譯時(shí)異常,托到項(xiàng)目就見紅)很難查,而且作者經(jīng)常不在線。在選擇開源框架時(shí)應(yīng)該選擇一些名氣比較大的,遇到異常網(wǎng)上能夠快速搜索得到的。
拓展知識(shí):
前沿拓展:
buffer overrun
可能是軟件被損壞了 重下一遍 還不行可能就是軟件沖突 **的問題了
Java異常的理解?
異常主要處理編譯期不能捕獲的錯(cuò)誤。出現(xiàn)問題時(shí)能繼續(xù)順利執(zhí)行下去,而不導(dǎo)致程序終止。確保程序的健壯性。Throwable 是所有 Java 程序中錯(cuò)誤處理的父類 ,有兩個(gè)子類:Error 和 Exception 。
未檢查異常和已檢查異常所有派生自Error和RuntimeException的類,都是未檢查異常.其余的是已檢查異常.未檢查異常意思就是說,編譯器不會(huì)檢查程序是否拋出異常,換句話說,程序員可以不用使用try-catch來捕獲異常,比如NullPointerException
Error :是程序無法處理的錯(cuò)誤,表示運(yùn)行應(yīng)用程序中較嚴(yán)重問題。大多數(shù)錯(cuò)誤與代碼編寫者執(zhí)行的**作無關(guān),而表示代碼運(yùn)行時(shí) JVM(Java 虛擬機(jī))出現(xià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)用程序來說,即使確實(shí)發(fā)生了錯(cuò)誤,本質(zhì)上也不應(yīng)該試圖去處理它所引起的異常狀況。在 Java中,錯(cuò)誤通過Error的子類描述。
Exception :表示可恢復(fù)的例外,這是可捕捉到的。
Java 提供了兩類主要的異常 :runtime exception 和 checked exception 。是程序本身可以處理的異常。
Exception 類有一個(gè)重要的子類 RuntimeException。RuntimeException 類及其子類表示“JVM 常用**作”引發(fā)的錯(cuò)誤。例如,若試圖使用空值對(duì)象引用、除數(shù)為零或數(shù)組越界,則分別引發(fā)運(yùn)行時(shí)異常(NullPointerException、ArithmeticException)和 ArrayIndexOutOfBoundException。
checked 異常也就是我們經(jīng)常遇到的 IO 異常,以及 SQL 異常都是這種異常。java編譯器強(qiáng)制要求catch此類異常. 對(duì)于這種異常, JAVA 編譯器強(qiáng)制要求我們必需對(duì)出現(xiàn)的這些異常進(jìn)行 catch 。所以,面對(duì)這種異常不管我們是否愿意,只能自己去寫一大堆 catch 塊去處理可能的異常。
只有java語言提供了Checked異常,Java認(rèn)為Checked異常都是可以被處理的異常,所以Java程序必須顯示處理Checked異常。如果程序沒有處理Checked異常,該程序在編譯時(shí)就會(huì)發(fā)生錯(cuò)誤無法編譯。這體現(xiàn)了Java的設(shè)計(jì)哲學(xué):沒有完善錯(cuò)誤處理的代碼根本沒有機(jī)會(huì)被執(zhí)行。對(duì)Checked異常處理方法有兩種
1 當(dāng)前方法知道如何處理該異常,則用try…catch塊來處理該異常。2 當(dāng)前方法不知道如何處理,則在定義該方法是聲明拋出該異常。
runtime exception ,也稱運(yùn)行時(shí)異常,我們可以不處理。當(dāng)出現(xiàn)這樣的異常時(shí),總是由虛擬機(jī)接管。比如:我們從來沒有人去處理過 NullPointerException 異常,它就是運(yùn)行時(shí)異常,并且這種異常還是最常見的異常之一。
出現(xiàn)運(yùn)行時(shí)異常后,系統(tǒng)會(huì)把異常一直往上層拋,一直遇到處理代碼。如果沒有處理塊,到最上層,如果是多線程就由 Thread.run() 拋出 ,如果是單線程就被 main() 拋出 。拋出之后,如果是線程,這個(gè)線程也就退出了。如果是主程序拋出的異常,那么這整個(gè)程序也就退出了。運(yùn)行時(shí)異常是 Exception 的子類,也有一般異常的特點(diǎn),是可以被 Catch 塊處理的。只不過往往我們不對(duì)他處理罷了。也就是說,你如果不對(duì)運(yùn)行時(shí)異常進(jìn)行處理,那么出現(xiàn)運(yùn)行時(shí)異常之后,要么是線程中止,要么是主程序終止。
如果不想終止,則必須撲捉所有的運(yùn)行時(shí)異常,決不讓這個(gè)處理線程退出。隊(duì)列里面出現(xiàn)異常數(shù)據(jù)了,正常的處理應(yīng)該是把異常數(shù)據(jù)舍棄,第二記錄日志。不應(yīng)該由于異常數(shù)據(jù)而影響下面對(duì)正常數(shù)據(jù)的處理。在這個(gè)場(chǎng)景這樣處理可能是一個(gè)比較好的應(yīng)用,但并不代表在所有的場(chǎng)景你都應(yīng)該如此。
如果在其它場(chǎng)景,遇到了一些錯(cuò)誤,如果退出程序比較好,這時(shí)你就可以不太理會(huì)運(yùn)行時(shí)異常 ,或者是通過對(duì)異常的處理顯式的控制程序退出。
異常處理的目標(biāo)之一就是為了把程序從異常中恢復(fù)出來。
遇到的異常類有哪些NullPointerException:空指針。**作一個(gè) null 對(duì)象的方法或?qū)傩詴r(shí)會(huì)拋出這個(gè)異常。ArrayIndexOutOfBoundsException:數(shù)組越界。IllegalArgumentException:參數(shù)非法。BufferOverflowException:緩存溢出。ClassNotFoundException:在編譯時(shí)無法找到指定的類。ClassCastException:類型強(qiáng)轉(zhuǎn)。java類型轉(zhuǎn)換錯(cuò)誤異常ExceptionInInitializerError:靜態(tài)初始值或靜態(tài)變量初始值期間發(fā)生異常。UnsatisfiedLinkError:JNI加載dll或者so文件時(shí)未找到。NoClassDefFoundError:在編譯時(shí)能找到合適的類,而在運(yùn)行時(shí)不能找到合適的類。OutofOutofMemoryError內(nèi)存出現(xiàn)異常的一種異常,這不是程序能控制的,是指要分配的對(duì)象的內(nèi)存超出了當(dāng)前最大的堆內(nèi)存,需要調(diào)整堆內(nèi)存大?。?Xmx)以及優(yōu)化程序。Exception和Error的區(qū)別
Exception:
1.可以是可被控制(checked) 或不可控制的(unchecked)
2.表示一個(gè)由程序員導(dǎo)致的錯(cuò)誤
3.應(yīng)該在應(yīng)用程序級(jí)被處理
Error:
1.總是不可控制的(unchecked)
2.經(jīng)常用來用于表示系統(tǒng)錯(cuò)誤或低層資源的錯(cuò)誤
3.如何可能的話,應(yīng)該在系統(tǒng)級(jí)被捕捉
需要注意的地方
1、try塊中的局部變量和catch塊中的局部變量(包括異常變量),以及finally中的局部變量,他們之間不可共享使用。
2、每一個(gè)catch塊用于處理一個(gè)異常。異常匹配是按照catch塊的順序從上往下尋找的,只有第一個(gè)匹配的catch會(huì)得到執(zhí)行。匹配時(shí),不僅運(yùn)行精確匹配,也支持父類匹配,因此,如果同一個(gè)try塊下的多個(gè)catch異常類型有父子關(guān)系,應(yīng)該將子類異常放在前面,父類異常放在后面,這樣保證每個(gè)catch塊都有存在的意義。
3、java中,異常處理的任務(wù)就是將執(zhí)行控制流從異常發(fā)生的地方轉(zhuǎn)移到能夠處理這種異常的地方去。也就是說:當(dāng)一個(gè)函數(shù)的某條語句發(fā)生異常時(shí),這條語句的后面的語句不會(huì)再執(zhí)行,它失去了焦點(diǎn)。執(zhí)行流跳轉(zhuǎn)到最近的匹配的異常處理catch代碼塊去執(zhí)行,異常被處理完后,執(zhí)行流會(huì)接著在“處理了這個(gè)異常的catch代碼塊”后面接著執(zhí)行。有的編程語言當(dāng)異常被處理后,控制流會(huì)恢復(fù)到異常拋出點(diǎn)接著執(zhí)行,這種策略叫做:resumption model of exception handling(恢復(fù)式異常處理模式 )而Java則是讓執(zhí)行流恢復(fù)到處理了異常的catch塊后接著執(zhí)行,這種策略叫做:termination model of exception handling(終結(jié)式異常處理模式)
如過我們遇到了運(yùn)行時(shí)異常應(yīng)該盡早可能的使用IDE提示的信息**到異常位置并處理,但是有些異常很難查到,如果想對(duì)異常得心應(yīng)手那么只有增加工作經(jīng)驗(yàn)多遇到異常多處理第二小編綜合來說出現(xiàn)異常的原因及處理手段確保下次不會(huì)遇到,就算遇到也能很快**到位置,還有另一種就是我們?cè)陧?xiàng)目中常常強(qiáng)調(diào)敏捷開發(fā),要確保一定的時(shí)間內(nèi)能夠讓項(xiàng)目更快的上線,這使得不少程序員經(jīng)常在一些開源社區(qū)中尋找合適的框架,但由于這些框架不是自己寫的所以框架產(chǎn)生的一些異常(最常見的是編譯時(shí)異常,托到項(xiàng)目就見紅)很難查,而且作者經(jīng)常不在線。在選擇開源框架時(shí)應(yīng)該選擇一些名氣比較大的,遇到異常網(wǎng)上能夠快速搜索得到的。
拓展知識(shí):
原創(chuàng)文章,作者:九賢生活小編,如若轉(zhuǎn)載,請(qǐng)注明出處:http://xiesong.cn/16168.html