国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

關(guān)于java異常處理(講義)

2019-11-18 15:05:53
字體:
供稿:網(wǎng)友

  第16講:異常處理
16.1、簡介:
異常是程序執(zhí)行時(shí)碰到的任何錯(cuò)誤情況或意外行為。
以下這些情況都可以引發(fā)異常:您的代碼或調(diào)用的代碼(如共享庫)中有錯(cuò)誤,操作系統(tǒng)資源不可用,公共語言運(yùn)行庫碰到意外情況(如無法驗(yàn)證代碼),等等

《Exception Handling for C++》關(guān)于異常處理論文,
向?qū)ο笾忻吭黾右粋€(gè)類,都可能包含一些錯(cuò)誤。
java使用和C++類似的異常處理
1、處理錯(cuò)誤的方法有很多流行方法
2、一般方法是把程序處理代碼段分散到系統(tǒng)代碼中,在可能發(fā)生錯(cuò)誤的地方處理錯(cuò)誤
優(yōu)點(diǎn):便于程序員能夠條理的看到程序中異常的處理
缺點(diǎn):異常處理程序“攪亂”代碼,程序員很難關(guān)心程序本身能否正常完成功能,而只關(guān)心了性能。
3、常見異常實(shí)例包括:數(shù)組下標(biāo)越界,算法溢出(超出數(shù)值表達(dá)范圍),除數(shù)為零,無效參數(shù)、內(nèi)存溢出
異常處理功能:主要處理一些同步異常(除數(shù)為0),不宜處理一些異步事件(Disk I/O End、網(wǎng)絡(luò)信息到達(dá)、點(diǎn)擊鼠標(biāo)、敲擊鍵盤)這些最好使用java事件監(jiān)聽。
異常處理程序:能夠讓系統(tǒng)在出現(xiàn)異常的情況下恢復(fù)過來的程序
使用異常處理情況:異常診斷與異常處理不在同一個(gè)位置下時(shí)使用異常處理程序(若用戶一直通過鍵盤與程序通話,那么就不能使用處理鍵盤輸入處理)
使用異常的注重事項(xiàng):
1、 異常處理位置與異常發(fā)生位置必須不同(若一個(gè)程序能夠處理自己的錯(cuò)誤,那么就采用傳統(tǒng)的錯(cuò)誤處理方式進(jìn)行局部處理)
2、 要避免使用異常處理來代替錯(cuò)誤處理,若這樣就會(huì)降低程序的清楚性。
3、 盡管可以使用異常處理來代替錯(cuò)誤處理,但會(huì)降低性能
4、 異常處理會(huì)占用程序的格外執(zhí)行時(shí)間
5、 異常處理能夠提高程序的容錯(cuò)性
6、 程序員使用JAVA標(biāo)準(zhǔn)的異常處理功能來代替他們的專用方法,可以在大型項(xiàng)目中提高程序的清楚性
7、 異常是超類Exception繼續(xù)的子類,主要如何處理“未撲獲的異常”,無法預(yù)料的異常。
8、 異常處理在java中原理:

異常處理有Method調(diào)用者的調(diào)用者或者M(jìn)ethod調(diào)用者來處理,
9、 異常處理適用分別開發(fā)的組件系統(tǒng)
10、 因?yàn)橐恍┏绦騿T使用不支持異常處理語言編程時(shí),往往拖延或忘記錯(cuò)誤處理程序的編寫,故,Java強(qiáng)制程序員從項(xiàng)目一開始就著手進(jìn)行異常處理,程序員必須投入很大精力把異常處理的策略融合到軟件產(chǎn)品中
11、 最好在進(jìn)行系統(tǒng)設(shè)計(jì)是就把異常處理融合在系統(tǒng)中,若系統(tǒng)一實(shí)現(xiàn),就很難添加異常處理功能

16.2如何使用異常處理:

在以下情況下使用異常處理:

1、 當(dāng)方法因無法控制的原因而不能實(shí)現(xiàn)其功能時(shí);
2、 處理來自程序組件整體異常,這些程序組件不適宜直接處理異常
3、 在大型項(xiàng)目中,對于每個(gè)項(xiàng)目都以一致的方式進(jìn)行錯(cuò)誤處理
4、 在類庫中出現(xiàn)每一個(gè)異常,都需要一個(gè)惟一錯(cuò)誤處理,在類庫中使用異常處理很合適

16.3 其他的錯(cuò)誤處理技術(shù):

處理異常的方法:
1、 在程序可以忽略異常(忽略異常在大型公用軟件和要害處理軟件可能會(huì)導(dǎo)致重大的軟件破壞,而自己用的軟件,通常可忽略一些錯(cuò)誤)
2、 碰到異常時(shí),程序可以根據(jù)提示來終止運(yùn)行(但是處理要害任務(wù)是絕對不可以采用,〈神5返回倉溫控系統(tǒng)〉?863項(xiàng)目。)

16.4 java異常處理的基礎(chǔ):

java的異常處理適用于在一個(gè)方法中能夠檢測出錯(cuò)誤單不能處理錯(cuò)誤的情況,這樣方法將拋出一個(gè)異常(JAVA無法保證“存在”的異常處理程序能夠處理某種異常,若“存在”,就“捕捉”異常,并處理“異常”,如找不到,那么:

命令行APP/控制臺APP(不基于GUI),當(dāng)異常不能被“捕捉”,那么該程序會(huì)運(yùn)行默認(rèn)異常處理程序,退出JAVA,若Applet或基于GUI的APP,當(dāng)一個(gè)異常未被“捕捉”,GUI在運(yùn)行默認(rèn)異常處理程序依然會(huì)顯示,而且用戶使用的GUI處于一個(gè)不穩(wěn)定的狀態(tài))

JAVA代碼中:1、可能出現(xiàn)異常的代碼-----{ …… try{拋出一個(gè)異常}-----程序塊 ……catch1{異常處理程序1};……catch100 {異常處理程序100}; finally{無類是否出現(xiàn)異常都執(zhí)行的程序}
1、 若try拋出Exception,App尋找在Catch1~100尋找合適異常處理程序,若找到,執(zhí)行CATCH{}代碼,沒有,執(zhí)行最后一個(gè)catch{}后代碼
2、 若try未拋出Exception,就執(zhí)行執(zhí)行最后一個(gè)catch{}后代碼。

3、 throws子句來拋出指定的異常,異常拋出點(diǎn)(throws 語句位置、try{}程序塊、try()程序塊中直接和間接調(diào)用的方法中)

4、 java采用終止方式異常處理,不是恢復(fù)方式的異常處理

5、 發(fā)生異常時(shí),異常四周信息(拋出對象本身類型)-------------異常處理程序

12.5一個(gè)異常處理的簡單實(shí)例:除數(shù)為0

需求:使用一個(gè)小應(yīng)用程序,完成兩數(shù)相除的計(jì)算

分析:
我們使用有頂向下,逐步求精的方法:
1、 首步我們一般在程序中先處理我們完成異常處理的類,完成異常處理的功能,因?yàn)榭赡艹龜?shù)為0是會(huì)出現(xiàn)異常,我們查找java.lang包中各個(gè)Exception類,發(fā)現(xiàn)RuntimeException類集合中的ArithmeticException可以處理運(yùn)算異常,我們就讓一個(gè)DivideByZeroException(繼續(xù)于ArithmeticException) 更非凡類來專門處理除數(shù)為零的異常。在DivideByZeroException()中調(diào)用super()(專門初始化傳如參數(shù)的方法)來傳如異常處理后對象描述(初始狀態(tài))
2、 第一步,創(chuàng)建一個(gè)Applet類完成完成兩數(shù)相除的計(jì)算
3、 第二步:處理對象與方法:聲明4個(gè)GUI組件對象和1個(gè)用于存儲計(jì)算結(jié)果(double)的和2個(gè)被除數(shù)與除數(shù)基本類型(int)

A、 初始化對象方法init()
B、 處理當(dāng)除數(shù)鍵盤輸入后,觸發(fā)事件進(jìn)行計(jì)算的方法(返回判定)action()

a、 因?yàn)樵诖朔椒ㄖ校锌赡艹霈F(xiàn)除數(shù)為0的可能,而且在計(jì)算中才回出現(xiàn)錯(cuò)誤,錯(cuò)誤出現(xiàn)后需要進(jìn)行處理異常,那么我在其中使用try{}程序塊先調(diào)用方法quotient進(jìn)行計(jì)算result=quotient(number1,number2),1、然后讓quotient()方法(使用方法體中的throws Ex{}拋出異常程序塊---此為深層嵌套)拋出異常(因?yàn)榇颂幚硇畔⒈容^簡單,但存在信息傳遞,我們讓其拖后處理)我們沒有顯式在try()塊中拋出異常。有拋出異常就有獲得異常,使用catch{}程序塊完成,a)、在quotient()中(實(shí)際深層嵌套throws Ex{}拋出異常程序塊),當(dāng)除數(shù)=0時(shí),就調(diào)用throw子句創(chuàng)建并拋出一個(gè)new catch{}“捕捉”(指定匹配類型DivideByZeroException) quotient()拋出異常信息(DivideByZeroException),而接受此信息是由exception接收,并調(diào)用toString()方法把exception轉(zhuǎn)換成字符串,使用showStatus(exception.toString()); 顯示出來 (因?yàn)樾枨笠箫@示異常)。b)、若當(dāng)除數(shù)!=0時(shí),那么就不拋出異常,然后將程序返回到try()程序塊中quotient()方法調(diào)用處,接著使用showStatus()方法顯示算式和結(jié)果(number1+”/”+number2+”=”+Double.toString(result))程序?qū)⑻^catch{}程序塊,action()方法將執(zhí)行return true

注重:當(dāng)quotient()拋出異常信息(DivideByZeroException)時(shí),quotient()終止執(zhí)行,這樣會(huì)對所有對象(4+2+1)設(shè)置標(biāo)記,用于無用單元回收處理;并在無用單元回收處理之前,還將運(yùn)行這些對象的終止函數(shù)。假如拋出異常,那么try在程序塊執(zhí)行showStatus之前終止。若try拋出異常之前自動(dòng)創(chuàng)建了對象,那么會(huì)對這些對象設(shè)置標(biāo)記,用于無用單元回收,同時(shí)在回收之前,還將運(yùn)行這些對象的終止函數(shù)。
b、 在action()方法中要注重處理:在TextField中第2個(gè)輸入結(jié)束并按下回車后,除數(shù)應(yīng)該怎樣獲得輸入的數(shù)字(number1=Integer.parseInt(input1.getText)),文本框如何獲得合法的文本(setText()).也包括判定(if (event.target==input2))

C、 因?yàn)閝uotient()方法任務(wù)比較多,所以要將此方法單獨(dú)與action來處理,而顯示程序的清楚性和可讀性,同時(shí)可以提高執(zhí)行效率和穩(wěn)定性能。

類圖與流程圖:

代碼:
//Fig 16.4: DivideByZeroException.java
//W.Qiang
//2005.J.6
public class DivideByZeroException extends ArithmeticException{
public DivideByZeroException()
{
super(“Attempted to divide by zero”);
}
}
import java.awt.*;
import java.awt.event.*
import java.applet.Applet;

public class DivideByZeroTest extends Applet
{
Label PRompt1,prompt2;
TextField input1,input2;
Int number1,number2;
Double result;

public void init()
{
prompt1=new Label (“輸入被除數(shù)”);
input1=new TextField(10);
prompt2=new Label (“輸入除數(shù)并按下回車”);
input2=new TextField(10);
add (prompt1);
add (input1);
add (prompt2);
add (input2);
}

public boolean action (Event event,Object obeject )
{
if (event.target==input2)
{
number1=Integer.parseInt(input1.getText());
input1.setText(“”);
number2=Integer.parseInt(input2.getText());
input2.setText(“”);

try {
result=quotient(number1,number2);
showStatus(number1+”/”+number2+”=”+Double.toString(result));
}

catch(DivideByZeroException exception) {
showStatus(exception.toString());
}
}
return true;
}
public double quotient(int numerator,int denominator)throws DivideByZeroException
{
if (denominator==0)
throw new DivideByZeroException ();
else (denominator!=0)
return(double) numerator / denominator ;
}
}

12.6 try程序塊:
try{
……}
catch(){
…….}
finally{ ……}
try后面跟0~多個(gè)catch程序塊
若try拋出Exception,App尋找在Catch1~100尋找合適異常處理程序,若找到,執(zhí)行CATCH{}代碼,沒有,執(zhí)行最后一個(gè)catch{}后代碼
若try未拋出Exception,就執(zhí)行執(zhí)行最后一個(gè)catch{}后代碼。
finally{無類是否出現(xiàn)異常都執(zhí)行的程序,必須完成資源釋放即終止函數(shù)調(diào)用,可避免資源泄露}
16.7 拋出異常:
throw 子句用來拋出異常,而throws子句用來指定異常
throw 的操作數(shù)是Throwable所有派生類,Throwable的直接子類是Exception(異常,由應(yīng)捕捉的問題引起,應(yīng)進(jìn)行處理)與Error(重大系統(tǒng)問題,一般不捕捉)
拋出異常拋出點(diǎn)有try{}塊、, try{}塊某個(gè)深層嵌套的作用域、try{}塊某個(gè)深層嵌套的方法中,throws指定異常,throw拋出的異常
try{}不包括錯(cuò)誤檢測語句與throw子句,但它的程序塊中所引用的對象將會(huì)執(zhí)行構(gòu)造函數(shù)中的錯(cuò)誤檢測代碼,并拋出異常
我們只要求異常終止產(chǎn)生異常的程序塊執(zhí)行,而不停止整個(gè)程序
異常信息傳遞通過對象引用產(chǎn)生,然后讓catch塊中的參數(shù)名(對象名)引用
16.8 捕捉異常:

異常處理程序包含在catch程序塊中
語法:
catch (classNmae---指定要拋出的異常的類型,參數(shù)名-----用來引用處理程序捕捉的對象){javaCode -----處理異常可執(zhí)行代碼}

catch使用注重事項(xiàng):
1、 若假設(shè)異常處理之后,程序控制將返回throw后的第一個(gè)語句,那么將導(dǎo)致邏輯錯(cuò)誤
2、 將catch程序塊的參數(shù)不能設(shè)置成多個(gè),一個(gè)catch只有一個(gè)參數(shù)
3、 若兩個(gè)catch程序塊(均和某個(gè)try程序塊有關(guān))都用于捕捉同一類型異常,那么將產(chǎn)生語法錯(cuò)誤
4、 捕捉非凡異常可能找不到,需要在下一層try中找,若找不到,那么命令行APP/控制臺APP(不基于GUI)將退出程序,Applet或基于GUI的APP將繼續(xù)執(zhí)行處于一個(gè)不穩(wěn)定的狀態(tài)的APP
5、 若某一類型異常,可能有幾個(gè)異常處理程序與他相匹配,那么執(zhí)行first相匹配的異常處理程序
6、 一個(gè)程序可以同時(shí)處理許多關(guān)系密切的異常,我們可謂此ExceptionGroup提供1個(gè)異常類與catch處理程序,當(dāng)某個(gè)異常發(fā)生時(shí),可根據(jù)不同的實(shí)例數(shù)據(jù)創(chuàng)建異常對象,同時(shí)catch檢查該數(shù)據(jù),以判定異常的類型;我們一般不提倡此種編程風(fēng)格,最好用繼續(xù)的方法解決
7、 在異常處理程序中,不能訪問try塊中定義的對象,異常處理開始,try快結(jié)束
8、 若執(zhí)行某個(gè)異常處理程序時(shí)又拋出一個(gè)異常,原try塊已經(jīng)終止,那么就讓原try外層try處理程序進(jìn)行處理,同時(shí)外層try程序監(jiān)視并處理原try塊的catch處理程序產(chǎn)生的錯(cuò)誤
9、 異常處理程序的形式:A、重拋出異常;B、通過拋出另一種不同類型的異常來轉(zhuǎn)換異常類型;C、通過執(zhí)行完最后一個(gè)異常處理程序之后,完成任何必要的恢復(fù)工作并使程序繼續(xù)執(zhí)行;D、判定產(chǎn)生錯(cuò)誤的原因,然后處理,并重新調(diào)用原來曾產(chǎn)生該異常的方法 E、簡單向Runtime返回一個(gè)狀態(tài)值 ……………等等
10、 傳統(tǒng)的控制流不使用異常,因“額外的”異常會(huì)“掩蓋”那些真正的錯(cuò)誤類型的異常,程序員很難跟蹤那些大量的異常,而且這里的異常不是經(jīng)常見到的
11、 catch處理程序拋出一個(gè)異常,將由catch處理或與同1個(gè)try塊相關(guān)的其他處理程序來處理,就會(huì)產(chǎn)生邏輯錯(cuò)誤

16.9 重拋出異常:
catch異常處理程序中出現(xiàn)異常,需要其他catch處理程序處理該異常
可以用throw重拋出異常

16.10 throws 子句:

用途:在一個(gè)method中,利用其列出該方法所能拋出的異常
int g (float h) throws a,b,c
{
//method body
}
拋出的對象為:指定類對象或者子類對象

1、運(yùn)行時(shí)異常:發(fā)生異常是某些可避免的事情出現(xiàn)錯(cuò)誤
此異常是RuntimeException類派生出來的
包括:ArrayIndexOutOfBoundsException(訪問一個(gè)越界數(shù)組下標(biāo)),NullPointerException(Null引用操作拋出---聲明而沒有創(chuàng)建對象);
ClassCastException (無效的類型轉(zhuǎn)換引發(fā))
IOException ,InterruptedException

Throws不必要顯式指出RuntimeException與Error,而要指出method或該method所調(diào)用的method顯式拋出非RuntimeException異常
3、 java異常區(qū)分:經(jīng)檢查的Exception(非RuntimeException);未經(jīng)檢查的Exception(RuntimeException);Error

注重事項(xiàng):
1、 method拋出一個(gè)經(jīng)檢查的Exception,若該Exception未列在throws子句中,會(huì)產(chǎn)生語法錯(cuò)誤
2、 試圖在一個(gè)沒有throws子句中method拋出異常,會(huì)產(chǎn)生語法錯(cuò)誤
3、 若method1調(diào)用method2(顯示拋出經(jīng)檢查的Exception),必須在method1的子句列出此異常,除非method2已經(jīng)捕捉此異常
4、 子類method的throws清單是父類method的throws清單的子集
5、 捕捉異常必須處理,才能滿足“java捕捉或聲明”。
6、 java編譯器強(qiáng)制程序員處理異常,絕對不能忽略異常處理
7、 java列出的Error見j2SDK 1.42 Documention 的java.lang package errors (AWTError)
8、 java列出的Exception見j2SDK 1.42 Documention 的java.lang package Exception 、 java.util package Exception 、java.io package Exception、java.awt package Exception、java.net package Exception

16.11構(gòu)造函數(shù)、終止函數(shù)和異常處理

當(dāng)構(gòu)造函數(shù)檢測錯(cuò)誤(不能返回值)解決方案(讓程序知道無法正確構(gòu)造該對象):
1、直接返回該錯(cuò)誤對象,當(dāng)使用該對象進(jìn)行判定,以確定此對象是否錯(cuò)誤
2、在該構(gòu)造函數(shù)外設(shè)定一個(gè)全局變量,都不是好方法3、拋出異常,把次函數(shù)錯(cuò)誤信息傳遞到外部,并處理該錯(cuò)誤
4、 當(dāng)該函數(shù)拋出Exception ,那么該函數(shù)建立的對象將被設(shè)置標(biāo)記,用與最終的無用單元回收處理,故需要調(diào)用終止函數(shù)。

16.12異常與繼續(xù):

因?yàn)槔^續(xù)關(guān)系,各種錯(cuò)誤可以多態(tài)處理
一般最好捕捉并處理父類異常,(僅當(dāng)所有子類對象的處理方法都一致才有意義),否則,捕捉子類異常

16.13 finally程序塊

若程序顯示使用某些資源,那么必須在最后完成對資源的釋放即無庸單元回收,在C與C++中,常見是指針不能回收,函數(shù)不能終止,出現(xiàn)“內(nèi)存泄露”
java實(shí)現(xiàn)自動(dòng)的無庸的單元回收功能,可避免“內(nèi)存泄露”,但java同樣存在別的“資源泄露”
一般在finally程序塊中使用一些資源釋放的代碼
1、 finally程序塊將try程序塊中所有打開文件關(guān)閉
2、 java并沒有徹底消除資源泄露、當(dāng)某個(gè)對象不存在是,java才對該對象進(jìn)行無庸單元回收處理,當(dāng)程序員錯(cuò)誤的對某個(gè)對象保持引用時(shí),就會(huì)出現(xiàn)內(nèi)存泄露
3、 exception ( String informationString):其中informationString是對該類異常描述信息,而獲得信息使用getMessage(用于返回保存在某個(gè)異常中的描述字符串)。PrintStackTrace(用于把方法調(diào)用堆棧的內(nèi)容打印出來,對測試程序非凡有用)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 广汉市| 张家港市| 抚州市| 武强县| 宁乡县| 陇川县| 穆棱市| 新密市| 都兰县| 民权县| 礼泉县| 庆阳市| 博乐市| 尚义县| 马龙县| 江达县| 广东省| 滦南县| 哈巴河县| 大足县| 大田县| 吉木乃县| 清涧县| 紫云| 克山县| 东莞市| 大港区| 泰宁县| 肇州县| 和田市| 宿迁市| 鸡西市| 奇台县| 剑河县| 祁东县| 霍山县| 遂宁市| 榆林市| 萨嘎县| 姜堰市| 太和县|