java-異常

異常簡(jiǎn)介

異常指阻止當(dāng)前方法繼續(xù)執(zhí)行的問(wèn)題像街,如:文件找不到筹裕、網(wǎng)絡(luò)連接失敗、非法參數(shù)等椎木。發(fā)現(xiàn)異常的理想時(shí)期是編譯階段,然而編譯期間.不能找出所有的異常,余下的問(wèn)題須在運(yùn)行期間.
java中的異常分為可查異常不可查異常

  1. 可查異常
    即編譯時(shí)異常,指編譯器在編譯時(shí)可以發(fā)現(xiàn)的錯(cuò)誤违柏,程序在運(yùn)行時(shí)很容易出現(xiàn)的異常狀況,這些異诚阕担可以預(yù)計(jì)勇垛,所以在編譯階段就必須手動(dòng)進(jìn)行捕捉處理,即要么用try-catch語(yǔ)句捕獲它士鸥,要么用throws子句聲明拋出闲孤,否則編譯無(wú)法通過(guò)。如IOException烤礁、SQLException以及用戶(hù)自定義的Exception異常
  2. 不可查異常
    不可查異常包括運(yùn)行時(shí)異常(runtimeException)和錯(cuò)誤(error),他們都是在程序運(yùn)行時(shí)出現(xiàn)的讼积。異常和錯(cuò)誤的區(qū)別:異常能被程序本身可以處理,錯(cuò)誤是無(wú)法處理
    運(yùn)行時(shí)異常(runtimeException)指的是程序在運(yùn)行時(shí)才會(huì)出現(xiàn)的錯(cuò)誤脚仔,由程序員自己分析代碼決定是否用try...catch進(jìn)行捕捉處理勤众。如nullpointerException,classcastException,indexoutofboundsException。
    錯(cuò)誤(error)鲤脏,是程序無(wú)法處理的錯(cuò)誤们颜,表示運(yùn)行應(yīng)用程序中較嚴(yán)重問(wèn)題,如系統(tǒng)崩潰吕朵,虛擬機(jī)錯(cuò)誤,動(dòng)態(tài)連接失敗等窥突。大多數(shù)錯(cuò)誤與代碼編寫(xiě)者執(zhí)行的操作無(wú)關(guān)努溃,而表示代碼運(yùn)行時(shí)JVM(Java虛擬機(jī))出現(xiàn)的問(wèn)題。例如阻问,Java虛擬機(jī)運(yùn)行錯(cuò)誤(VirtualMachineError)梧税,當(dāng)JVM不再有繼續(xù)執(zhí)行操作所需的內(nèi)存資源時(shí),將出現(xiàn)OutOfMemoryError称近。這些異常發(fā)生時(shí)第队,Java虛擬機(jī)(JVM)一般會(huì)選擇線(xiàn)程終止。這些錯(cuò)誤表示故障發(fā)生于虛擬機(jī)自身刨秆、或者發(fā)生在虛擬機(jī)試圖執(zhí)行應(yīng)用時(shí)凳谦,如Java虛擬機(jī)運(yùn)行錯(cuò)誤(VirtualMachineError)、類(lèi)定義錯(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異常類(lèi)層次結(jié)構(gòu)圖:

從上圖可以看出Java通過(guò)API中Throwable類(lèi)的眾多子類(lèi)描述各種不同的異常。因而驯镊,Java異常都是對(duì)象葫督,是Throwable子類(lèi)的實(shí)例.
在Java中,所有的異常都有一個(gè)共同的祖先Throwable(可拋出)板惑。Throwable指定代碼中可用異常傳播機(jī)制通過(guò)Java應(yīng)用程序傳輸?shù)娜魏螁?wèn)題的共性橄镜。

異常處理機(jī)制

當(dāng)異常發(fā)生時(shí),將使用new在堆上創(chuàng)建一個(gè)異常對(duì)象,對(duì)于這個(gè)異常對(duì)象,有兩種處理方式.
1.使用throw關(guān)鍵字將異常對(duì)象拋出,則當(dāng)前執(zhí)行路徑被終止,異常處理機(jī)制將在其他地方尋找catch塊對(duì)異常進(jìn)行處理.
2.使用try...catch在當(dāng)前邏輯中就進(jìn)行捕獲處理.

throws 和throw

  1. throws: 一個(gè)方法在聲明時(shí)可以使用throws關(guān)鍵字聲明可能會(huì)產(chǎn)生的若干異常。
  2. throw: 拋出異常冯乘,并退出當(dāng)前方法或作用域洽胶。

用throws聲明要拋出的異常,實(shí)際可以不拋出裆馒。而用throw拋出的異常也可以不聲明姊氓。不過(guò)Java鼓勵(lì)程序員把可能會(huì)拋出的異常提前聲明,這是一種優(yōu)雅的做法喷好。

自定義異常

Java的異常體系不可能包括所有的異常情況翔横,所以可以自己定義異常類(lèi)來(lái)表示程序中可能會(huì)遇到的特定問(wèn)題。

public class MyException extends RuntimeException {
    public MyException() {
    }
public MyException(String message) {
        super(message);
    }
}

在 MyException 這個(gè)自定義異常中梗搅,定義了兩個(gè)構(gòu)造器禾唁。一個(gè)是默認(rèn)構(gòu)造器效览,一個(gè)接收一個(gè)字符串作為參數(shù)。在第二個(gè)構(gòu)造器中荡短,可以看出調(diào)用了基類(lèi)構(gòu)造器丐枉,所傳字符串可以通過(guò)getMessage()方法獲取。

public class ExceptionTest {
    public static void f(){
        System.out.println("Throwing Exception from f()");
        throw new MyException();
    }

    public static void g(){
        System.out.println("Throwing Exception from g()");
        throw new MyException("Originated in g()");
    }


    public static void main(String[] argv) throws Exception {
        try{
            f();
        }catch(MyException e){
            System.out.println(e.getMessage());
            e.printStackTrace(System.out);
        }
    }
}

在main函數(shù)中調(diào)用g(),運(yùn)行結(jié)果如下



可以總結(jié)出以下兩個(gè)函數(shù):

  1. getMessage():獲取一些描述性信息
  2. printStackTrace():從方法調(diào)用出到異常拋出處的方法調(diào)用序列

重新拋出異常

有時(shí)希望把捕獲的異常重新拋出肢预,在catch中已經(jīng)得到了對(duì)當(dāng)前異常對(duì)象的引用矛洞,可以將其重新拋出。

public class ExceptionTest {

    public static void g() {
        throw new MyException("Originated in g()");
    }

    public static void h() {
        try {
            g();
        } catch (MyException e) {
            System.out.println("An Exception was thrown from g()");
            throw e;
        }
    }

    public static void k() throws Exception {
        try {
            g();
        } catch (MyException e) {
            System.out.println("An Exception was thrown from g()");
            throw (Exception) e.fillInStackTrace();
        }
    }


    public static void main(String[] argv) throws Exception {
        try {
            h();
        } catch (MyException e) {
            System.out.println(e.getMessage());
            e.printStackTrace(System.out);
        }
        System.out.println();

        try {
            k();
        } catch (Exception e) {
            System.out.println(e.getMessage());
            e.printStackTrace(System.out);
        }
    }
}

從運(yùn)行結(jié)果可以看出烫映,如果只是將異常拋出沼本,那么printStackTrace()顯示的仍是原來(lái)拋出點(diǎn)的調(diào)用棧信息,并非重新拋出點(diǎn)的信息锭沟,若想更新信息抽兆,可以調(diào)用
fillInStackTrace()方法,它通過(guò)把當(dāng)前調(diào)用棧信息填入原來(lái)那個(gè)異常對(duì)象而建立族淮。這樣調(diào)用fillInStackTrace()的那一行就會(huì)新的異常發(fā)生點(diǎn)辫红。

使用finally清理

在java中finally的存在并不是為了釋放內(nèi)存資源,因?yàn)閖ava有垃圾回收機(jī)制祝辣,因此需要java釋放的資源主要是:已經(jīng)打開(kāi)的文件或網(wǎng)絡(luò)連接等贴妻。
在try中無(wú)論有沒(méi)有捕獲異常,finally都會(huì)被執(zhí)行蝙斜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末名惩,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子孕荠,更是在濱河造成了極大的恐慌娩鹉,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稚伍,死亡現(xiàn)場(chǎng)離奇詭異弯予,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)个曙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)锈嫩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人垦搬,你說(shuō)我怎么就攤上這事祠挫。” “怎么了悼沿?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵等舔,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我糟趾,道長(zhǎng)慌植,這世上最難降的妖魔是什么甚牲? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蝶柿,結(jié)果婚禮上丈钙,老公的妹妹穿的比我還像新娘。我一直安慰自己交汤,他們只是感情好雏赦,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著芙扎,像睡著了一般星岗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戒洼,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天俏橘,我揣著相機(jī)與錄音,去河邊找鬼圈浇。 笑死寥掐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的磷蜀。 我是一名探鬼主播召耘,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼褐隆!你這毒婦竟也來(lái)了污它?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妓灌,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后蜜宪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體虫埂,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年圃验,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了掉伏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡澳窑,死狀恐怖斧散,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摊聋,我是刑警寧澤鸡捐,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站麻裁,受9級(jí)特大地震影響箍镜,放射性物質(zhì)發(fā)生泄漏源祈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一色迂、第九天 我趴在偏房一處隱蔽的房頂上張望香缺。 院中可真熱鬧,春花似錦歇僧、人聲如沸图张。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)祸轮。三九已至,卻和暖如春写隶,著一層夾襖步出監(jiān)牢的瞬間倔撞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工慕趴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留痪蝇,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓冕房,卻偏偏與公主長(zhǎng)得像躏啰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耙册,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 通俗編程——白話(huà)JAVA異常機(jī)制 - 代碼之道给僵,編程之法 - 博客頻道 - CSDN.NEThttp://blog...
    葡萄喃喃囈語(yǔ)閱讀 3,165評(píng)論 0 25
  • Java異常 異常指不期而至的各種狀況,如:文件找不到详拙、網(wǎng)絡(luò)連接失敗帝际、非法參數(shù)等。異常是一個(gè)事件饶辙,它發(fā)生在程序運(yùn)行...
    java部落閱讀 3,099評(píng)論 1 13
  • 概念介紹 異常是發(fā)生在程序執(zhí)行過(guò)程中阻礙程序正常執(zhí)行的錯(cuò)誤事件蹲诀,當(dāng)一個(gè)程序出現(xiàn)錯(cuò)誤時(shí),可能的情況有如下3種: 語(yǔ)法...
    niaoge2016閱讀 5,163評(píng)論 2 20
  • 4.2 拋出異常 任何Java代碼都可以?huà)伋霎惓F浚纾鹤约壕帉?xiě)的代碼脯爪、來(lái)自Java開(kāi)發(fā)環(huán)境包中代碼,或者Java運(yùn)...
    java部落閱讀 819評(píng)論 0 1
  • 初識(shí)異常(Exception) 比如我們?cè)谌?shù)組里面的某個(gè)值得時(shí)候矿微,經(jīng)常會(huì)出現(xiàn)定義的取值范圍超過(guò)了數(shù)組的大小痕慢,那么...
    iDaniel閱讀 1,864評(píng)論 1 2