015_面向对象_异常,包和Object类
1.異常(http://blog.csdn.net/hguisu/article/details/6155636)
(1)異常的定義
異常是指在運行期間發(fā)生的不正常情況,java中用類的形式對不正常情況進行了描述和封裝,稱為異常類。不同的問題用不同的類進行具體的描述。
問題很多,描述的類也很多,將其共性進行向上抽取,形成了異常體系。
?
(2)異常的體系
①Error(程序不可處理的)
?是由jvm拋出的嚴重性問題,這種問題發(fā)生一般不針對性處理,直接修改程序。
②Exception(程序可以處理的)
?
(3)Exception的分類
①編譯時異常:Exception中除了子類RuntimeException的異常體系。
這種問題一旦出現(xiàn),希望在編譯時就進行檢測,讓這種問題有對應的處理方式,都可以針對性的處理
②運行時異常:Exception中的RuntimeException體系。
這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發(fā)生。
運行時異常的特點是Java編譯器不會檢查它,當程序中可能出現(xiàn)這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。
?
(4)throw和throws的區(qū)別
①throws使用在方法上,throw使用在函數(shù)內(nèi)
②throws拋出的是異常類,可以拋出多個,用逗號隔開,throw拋出的是異常對象。
?
(5)異常處理的機制
①拋出異常:當一個方法出現(xiàn)錯誤引發(fā)異常時,方法創(chuàng)建異常對象并交付運行時系統(tǒng),異常對象中包含了異常類型和異常出現(xiàn)時的程序狀態(tài)等異常信息。運行時系統(tǒng)負責尋找處置異常的代碼并執(zhí)行。
②捕獲異常:在方法拋出異常之后,運行時系統(tǒng)將轉(zhuǎn)為尋找合適的異常處理器。潛在的異常處理器是異常發(fā)生時依次存留在調(diào)用棧中的方法的集合。當異常處理器所能處理的異常類型與方法拋出的
? ?異常類型相符時,即為合適 的異常處理器。運行時系統(tǒng)從發(fā)生異常的方法開始,依次回查調(diào)用棧中的方法,直至找到含有合適異常處理器的方法并執(zhí)行。當運行時系統(tǒng)遍歷調(diào)用棧而未
? ?找到合適 的異常處理器,則運行時系統(tǒng)終止。同時,意味著Java程序的終止。
具體格式是:
try
{
//需要被檢測異常的diamond
}
catch(異常類1 變量)//該變量用于接受發(fā)生的異常
{
//處理異常的代碼
}
catch(異常類2 變量)//該變量用于接受發(fā)生的異常
{
//處理異常的代碼
}
finally
{
//無論是否捕獲或處理異常,一定會被執(zhí)行的代碼,當在try塊或catch塊中遇到return語句時,finally語句塊將在方法返回之前被執(zhí)行。
}
? ?
(6)異常處理的原則
①函數(shù)內(nèi)容如果拋出需要檢測的異常,那么函數(shù)上必須要聲明。否則必須在函數(shù)內(nèi)用try catch捕捉,否則編譯失敗
②如果調(diào)用到了聲明異常的函數(shù),要么try catch要么throws,否則編譯失敗
③什么時候catch,什么時候throws呢?
功能內(nèi)容可以解決,用catch
解決不了,用throws告訴調(diào)用者,由調(diào)用者解決
④一個功能如果拋出了多個異常,那么調(diào)用時,必須有對應的多個catch進行
針對性處理。內(nèi)部有幾個需要檢測的異常,就拋幾個異常,拋出幾個,就catch幾個。
?
(7)異常的注意事項
①子類在覆蓋父類方法時,父類的方法如果拋出了異常
那么子類的方法只能拋出父類的異常或者該異常的父類
②如果父類拋出多個異常,那么子類只能拋出父類異常的子集
簡單說,子類覆蓋父類只能拋出父類的異常或者子類或者子集
③如果父類的方法沒有拋出異常,那么子類覆蓋時絕對不能拋,就只能try。
④多catch時,父類的catch放在最下面。
class LanPingException extends Exception {LanPingException(String msg){super(msg);} }class MaoYanException extends Exception {MaoYanException(String msg){super(msg);} }class NoPlanException extends Exception {NoPlanException(String msg){super(msg);} }class Computer {private int state=1;public void run() throws LanPingException,MaoYanException{if(state==1){throw new LanPingException("電腦藍屏啦!");}else if(state==2){throw new MaoYanException("電腦冒煙啦!");}}public void reset(){System.out.println("電腦重啟");state=0;} }class Teacher {private String name;private Computer computer;Teacher(String name){this.name=name;computer=new Computer();}public void prelect()throws NoPlanException{try{computer.run();System.out.println(name+"講課");}catch(LanPingException e){System.out.println(e.toString());computer.reset();prelect();}catch(MaoYanException e){System.out.println(e.toString());test();throw new NoPlanException("課時進度無法完成,原因:"+e.getMessage());}}public void test(){System.out.println("電腦壞了,同學們自習!");} }class ExceptionDemo {public static void main(String[] args){Teacher t=new Teacher("李老師");try{t.prelect();}catch(NoPlanException e){System.out.println(e.toString()+"......");System.out.println("換人");}} }2.包
(1)對類文件進行分類管理,給類提供多層命名(名稱)空間。
?
(2)包與包之間的類進行訪問,被訪問的包中的類必須是public的,被訪問的包中的類的方法也必須是public。
public protected default(默認) private
同一類中 ok ok ok ok
同一包中 ? ok ? ok ok
子類中 ??? ?ok? ok
不同包中 ??ok
?
(3)導包原則:用到哪個類,就導入哪個類,一般不建議直接導包。? ? ?import 包名.*; //導入包中的所有的類。
(4)jar包:將寫好的一些類進行打包,再把這些jar包引入你的項目中,然后就可以直接使用這些jar包中的類和屬性了,jar包一般都會放在lib目錄下。
3.Object類
(1)Object類是不斷抽取而來的,具備所有對象都具備的共性內(nèi)容。
(2)equals方法
①對于任何非空的參考值x和y ,當且僅當x和y引用相同的對象( x == y具有值true )時,該方法返回true 。
②一般都會覆蓋equals方法,根據(jù)對象的特有內(nèi)容,建立判斷對象是否相同的依據(jù)。
(3)hashCode方法
返回對象的哈希碼值,如果equals方法沒有被覆蓋,每次返回的值應相同。
(4)getClass方法
獲取當前對象的字節(jié)碼文件對象。
(5)toString方法
返回該對象的字符串表示。如果沒有重寫toString方法,那么輸出來的默認的字符串內(nèi)容是“類名+哈希編碼”。
?
轉(zhuǎn)載于:https://www.cnblogs.com/lydbky/p/8305902.html
總結
以上是生活随笔為你收集整理的015_面向对象_异常,包和Object类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring boot logback配
- 下一篇: Nginx 实现AJAX跨域请求