摘要:異常,可以有針對(duì)性的處理方式無(wú)論是錯(cuò)誤還是異常,它們都有具體的子類體現(xiàn)每一個(gè)問題,它們的子類都有一個(gè)共性,就是都以父類名才作為子類的后綴名。特殊情況對(duì)應(yīng)多個(gè)時(shí),如果有父類的語(yǔ)句塊,一定要放在下面。聲明的原因是需要調(diào)用者對(duì)該異常進(jìn)行處理。
異 常:★★★★
異常:就是不正常。程序在運(yùn)行時(shí)出現(xiàn)的不正常情況。其實(shí)就是程序中出現(xiàn)的問題。這個(gè)問題按照面向?qū)ο笏枷脒M(jìn)行描述,并封裝成了對(duì)象。因?yàn)閱栴}的產(chǎn)生有產(chǎn)生的原因、有問題的名稱、有問題的描述等多個(gè)屬性信息存在。當(dāng)出現(xiàn)多屬性信息最方便的方式就是將這些信息進(jìn)行封裝。異常就是java按照面向?qū)ο蟮乃枷雽栴}進(jìn)行對(duì)象封裝。這樣就方便于操作問題以及處理問題。
出現(xiàn)的問題有很多種,比如角標(biāo)越界,空指針等都是。就對(duì)這些問題進(jìn)行分類。而且這些問題都有共性內(nèi)容比如:每一個(gè)問題都有名稱,同時(shí)還有問題描述的信息,問題出現(xiàn)的位置,所以可以不斷的向上抽取。形成了異常體系。
--------java.lang.Throwable:
Throwable:可拋出的。
|--Error:錯(cuò)誤,一般情況下,不編寫針對(duì)性的代碼進(jìn)行處理,通常是jvm發(fā)生的,需要對(duì)程序進(jìn)行修正。
|--Exception:異常,可以有針對(duì)性的處理方式
無(wú)論是錯(cuò)誤還是異常,它們都有具體的子類體現(xiàn)每一個(gè)問題,它們的子類都有一個(gè)共性,就是都以父類名才作為子類的后綴名。
這個(gè)體系中的所有類和對(duì)象都具備一個(gè)獨(dú)有的特點(diǎn);就是可拋性。
可拋性的體現(xiàn):就是這個(gè)體系中的類和對(duì)象都可以被throws和throw兩個(gè)關(guān)鍵字所操作。class ExceptionDemo{
public static void main(String[] args) {
//byte[] buf = new byte[10241024700];//java.lang.OutOfMemoryError內(nèi)存溢出錯(cuò)誤
}
在開發(fā)時(shí),如果定義功能時(shí),發(fā)現(xiàn)該功能會(huì)出現(xiàn)一些問題,應(yīng)該將問題在定義功能時(shí)標(biāo)示出來(lái),這樣調(diào)用者就可以在使用這個(gè)功能的時(shí)候,預(yù)先給出處理方式。
如何標(biāo)示呢?通過(guò)throws關(guān)鍵字完成,格式:throws 異常類名,異常類名...
這樣標(biāo)示后,調(diào)用者,在使用該功能時(shí),就必須要處理,否則編譯失敗。
處理方式有兩種:1、捕捉;2、拋出。
對(duì)于捕捉:java有針對(duì)性的語(yǔ)句塊進(jìn)行處理。
try {
需要被檢測(cè)的代碼;
}
catch(異常類 變量名){
異常處理代碼;
}
fianlly{
一定會(huì)執(zhí)行的代碼;
catch (Exception e) { //e用于接收try檢測(cè)到的異常對(duì)象。
System.out.println("message:"+e.getMessage());//獲取的是異常的信息。
System.out.println("toString:"+e.toString());//獲取的是異常的名字+異常的信息。
e.printStackTrace();//打印異常在堆棧中信息;異常名稱+異常信息+異常的位置。
異常處理原則:功能拋出幾個(gè)異常,功能調(diào)用如果進(jìn)行try處理,需要與之對(duì)應(yīng)的catch處理代碼塊,這樣的處理有針對(duì)性,拋幾個(gè)就處理幾個(gè)。
特殊情況:try對(duì)應(yīng)多個(gè)catch時(shí),如果有父類的catch語(yǔ)句塊,一定要放在下面。
throw 和throws關(guān)鍵字的區(qū)別:
throw用于拋出異常對(duì)象,后面跟的是異常對(duì)象;throw用在函數(shù)內(nèi)。
throws用于拋出異常類,后面跟的異常類名,可以跟多個(gè),用逗號(hào)隔開。throws用在函數(shù)上。
通常情況:函數(shù)內(nèi)容如果有throw,拋出異常對(duì)象,并沒有進(jìn)行處理,那么函數(shù)上一定要聲明,否則編譯失敗。但是也有特殊情況。
異常分兩種:
1:編譯時(shí)被檢查的異常,只要是Exception及其子類都是編譯時(shí)被檢測(cè)的異常。
2:運(yùn)行時(shí)異常,其中Exception有一個(gè)特殊的子類RuntimeException,以及RuntimeException的子類是運(yùn)行異常,也就說(shuō)這個(gè)異常是編譯時(shí)不被檢查的異常。
編譯時(shí)被檢查的異常和運(yùn)行時(shí)異常的區(qū)別:
編譯被檢查的異常在函數(shù)內(nèi)被拋出,函數(shù)必須要聲明,否編譯失敗。
聲明的原因:是需要調(diào)用者對(duì)該異常進(jìn)行處理。
運(yùn)行時(shí)異常如果在函數(shù)內(nèi)被拋出,在函數(shù)上不需要聲明。
不聲明的原因:不需要調(diào)用者處理,運(yùn)行時(shí)異常發(fā)生,已經(jīng)無(wú)法再讓程序繼續(xù)運(yùn)行,所以,不讓調(diào)用處理的,直接讓程序停止,由調(diào)用者對(duì)代碼進(jìn)行修正。
定義異常處理時(shí),什么時(shí)候定義try,什么時(shí)候定義throws呢?
功能內(nèi)部如果出現(xiàn)異常,如果內(nèi)部可以處理,就用try;
如果功能內(nèi)部處理不了,就必須聲明出來(lái),讓調(diào)用者處理。
自定義異常:當(dāng)開發(fā)時(shí),項(xiàng)目中出現(xiàn)了java中沒有定義過(guò)的問題時(shí),這時(shí)就需要我們按照java異常建立思想,將項(xiàng)目的中的特有問題也進(jìn)行對(duì)象的封裝。這個(gè)異常,稱為自定義異常。
對(duì)于除法運(yùn)算,0作為除數(shù)是不可以的。java中對(duì)這種問題用ArithmeticException類進(jìn)行描述。對(duì)于這個(gè)功能,在我們項(xiàng)目中,除數(shù)除了不可以為0外,還不可以為負(fù)數(shù)??墒秦?fù)數(shù)的部分java并沒有針對(duì)描述。所以我們就需要自定義這個(gè)異常。
自定義異常的步驟:
1:定義一個(gè)子類繼承Exception或RuntimeException,讓該類具備可拋性。
2:通過(guò)throw 或者throws進(jìn)行操作。
異常的轉(zhuǎn)換思想:當(dāng)出現(xiàn)的異常是調(diào)用者處理不了的,就需要將此異常轉(zhuǎn)換為一個(gè)調(diào)用者可以處理的異常拋出。
try catch finally的幾種結(jié)合方式:
1,
try
catch
finally
這種情況,如果出現(xiàn)異常,并不處理,但是資源一定關(guān)閉,所以try finally集合只為關(guān)閉資源。
記?。篺inally很有用,主要用戶關(guān)閉資源。無(wú)論是否發(fā)生異常,資源都必須進(jìn)行關(guān)閉。
System.exit(0); //退出jvm,只有這種情況finally不執(zhí)行。
當(dāng)異常出現(xiàn)后,在子父類進(jìn)行覆蓋時(shí),有了一些新的特點(diǎn):
1:當(dāng)子類覆蓋父類的方法時(shí),如果父類的方法拋出了異常,那么子類的方法要么不拋出異常要么拋出父類異?;蛘咴摦惓5淖宇?,不能拋出其他異常。
2:如果父類拋出了多個(gè)異常,那么子類在覆蓋時(shí)只能拋出父類的異常的子集。
注意:
如果父類或者接口中的方法沒有拋出過(guò)異常,那么子類是不可以拋出異常的,如果子類的覆蓋的方法中出現(xiàn)了異常,只能try不能throws。
如果這個(gè)異常子類無(wú)法處理,已經(jīng)影響了子類方法的具體運(yùn)算,這時(shí)可以在子類方法中,通過(guò)throw拋出RuntimeException異?;蛘咂渥宇悾@樣,子類的方法上是不需要throws聲明的。
常見異常:
1、腳標(biāo)越界異常(IndexOutOfBoundsException)包括數(shù)組、字符串;
空指針異常(NullPointerException)
2、類型轉(zhuǎn)換異常:ClassCastException
3、沒有這個(gè)元素異常:NullPointerException
4、不支持操作異常;
異常要盡量避免,如果避免不了,需要預(yù)先給出處理方式。比如家庭備藥,比如滅火器。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/73216.html
摘要:添加任務(wù)成功運(yùn)行任務(wù)名稱添加定時(shí)任務(wù)服務(wù)定時(shí)任務(wù)服務(wù)。觸發(fā)器計(jì)劃列表添加測(cè)試任務(wù)類測(cè)試任務(wù)類被任務(wù)調(diào)度后執(zhí)行該任務(wù)類。聲明一個(gè)靜態(tài)變量保存添加啟動(dòng)類簡(jiǎn)單微服務(wù),不支持分布式。 SpringCloud(第 009 篇)簡(jiǎn)單 Quartz 微服務(wù),不支持分布式 - 一、大致介紹 1、本章節(jié)僅僅只是為了測(cè)試 Quartz 在微服務(wù)中的使用情況; 2、其實(shí)若只是簡(jiǎn)單的實(shí)現(xiàn)任務(wù)調(diào)用而言的話,Sp...
摘要:靜態(tài)塊代碼初始化其實(shí),整個(gè)靜態(tài)代碼塊可以看作是一個(gè)靜態(tài)成員。和普通的非靜態(tài)成員初始化一樣,它的執(zhí)行也發(fā)生在構(gòu)造器調(diào)用之前,并且每當(dāng)創(chuàng)建對(duì)象之前都會(huì)調(diào)用??诶^承中涉及的初始化大的原則是沒有父類,就沒子類。 這個(gè)教程,咱們來(lái)對(duì)Java中設(shè)計(jì)到的初始化規(guī)則,或者說(shuō)初始化順序,來(lái)做一下匯總,這里我基本上把Java中,默認(rèn)初始化,靜態(tài)成員初始化,非靜態(tài)成員初始化,靜態(tài)代碼塊,非靜態(tài)代碼塊,以及繼...
摘要:概述上一章講咯生命周期,這一章就是事件處理咯事件綁定綁定一個(gè)外部函數(shù)按鈕綁定一個(gè)內(nèi)部函數(shù)按鈕解決函數(shù)綁定的問題上面的栗子有個(gè)問題在內(nèi)無(wú)法訪問內(nèi)的資源,比如按鈕可以這么解決這個(gè)問題按鈕或者按鈕或者按鈕第三中方式需要支持 0x000 概述 上一章講咯生命周期,這一章就是事件處理咯 0x001 事件綁定 // 綁定一個(gè)外部函數(shù) function handleClick(event) { ...
摘要:本文要來(lái)分享給大家程序員最常用的日志框架組件。沒有基礎(chǔ)的同學(xué)也不要著急,這套教程覆蓋了目前所有的日志框架,只要你學(xué),就一定用得到,先收藏,以備不時(shí)之需。 作為一名Java程序員,我們開發(fā)了很多Java應(yīng)用程序,包括桌面應(yīng)用、WEB應(yīng)用以及移動(dòng)應(yīng)用。然而日志系統(tǒng)是一個(gè)成熟Java應(yīng)用所必不可少的。在開發(fā)和調(diào)試階段,日志可以幫...
摘要:當(dāng)用戶注銷或退出時(shí),釋放連接,清空對(duì)象中的登錄狀態(tài)。聊天管理模塊系統(tǒng)的核心模塊,這部分主要使用框架實(shí)現(xiàn),功能包括信息文件的單條和多條發(fā)送,也支持表情發(fā)送。描述讀取完連接的消息后,對(duì)消息進(jìn)行處理。 0.前言 最近一段時(shí)間在學(xué)習(xí)Netty網(wǎng)絡(luò)框架,又趁著計(jì)算機(jī)網(wǎng)絡(luò)的課程設(shè)計(jì),決定以Netty為核心,以WebSocket為應(yīng)用層通信協(xié)議做一個(gè)互聯(lián)網(wǎng)聊天系統(tǒng),整體而言就像微信網(wǎng)頁(yè)版一樣,但考慮...
閱讀 5291·2021-10-13 09:39
閱讀 2044·2019-08-29 11:12
閱讀 1211·2019-08-28 18:16
閱讀 1932·2019-08-26 12:16
閱讀 1316·2019-08-26 12:13
閱讀 3056·2019-08-26 10:59
閱讀 2397·2019-08-23 18:27
閱讀 3065·2019-08-23 18:02