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

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

J2SE綜合:JAVA異常處理方式的區(qū)別和分析

2019-11-17 04:59:26
字體:
供稿:網(wǎng)友
一、內(nèi)層方法拋出異常,外層方法捕捉并處理異常:

public void methodA (){
   try{
       // 調(diào)用methodB
       methodB();
   }
   catch(ExceptionType et){
      // 相應(yīng)處理措施
   }
}

public void methodB throws ExceptionType{
    if (condition is true)
    {
  // 相應(yīng)處理措施
    }
 else
 {
  throw new ExceptionType(argument);
 }
}

在這個例子中,方法B的頭部中聲明了該方法會拋出一個類型為ExceptionType的異常,在方法體中使用throw子句拋出了一個異常,那么該異常被誰捕捉到呢,答案是方法A。因為異常拋出后,JVM會順著該方法的調(diào)用棧一層一層的往上找。因為方法A中有一個catch(ExceptionType et),所以被拋出的異常會被捕捉到并處理。


二、方法中自己捕捉,處理異常:

public methodA() {
 try
 {
  // 可能產(chǎn)生異常的語句
 }
 catch (ExceptionType et)
 {
  // 相應(yīng)的處理
 }
}
在這個例子中,方法A使用了try-catch語句塊,那么意味著在方法中所產(chǎn)生的ExceptionType類型的異常都會被捕捉到并在方法內(nèi)處理。


三、內(nèi)層方法拋出一個異常,但本身又有try-catch

public methodB() throws ExceptionType{
 
 try
 {
  // 可能產(chǎn)生異常的語句
 }
 catch (AnotherExceptionType aet)
 {
  // 相應(yīng)處理措施
 }
}
在這個例子中有兩種異常處理情況,拋出異常和捕捉異常,如果在try語句塊中產(chǎn)生ExceptionType類型的異常的話,會被拋出。如果產(chǎn)生AnotherExceptionType類型的話,則不會被拋出,因為在方法B的頭部中并沒有聲明會拋出該異常。


四、內(nèi)層方法拋出一個異常,但本身有try-finally

public methodB() throws ExceptionType{

 try
 {
  // 可能產(chǎn)生異常的語句
 }
 finally
 {
  // 一定要執(zhí)行的語句
 }
}
這個例子與上一個例子很像,不同的是沒有catch,但增加了finally。它的意思如果方法B中try語句塊中如果產(chǎn)生了異常,則拋出由外層方法處理。然后方法B繼續(xù)執(zhí)行finally中的語句


下面列舉三種錯誤的異常處理方法:

一、內(nèi)層方法拋出一個異常,但本身有捕捉這個異常

public methodB() throws ExceptionType{
 
 try
 {
  // 可能產(chǎn)生異常的語句
 }
 catch (ExceptionType et)
 {
  // 相應(yīng)處理措施
 }
}
在這個例子中,方法B在頭部聲明了會拋出一個類型為ExceptionType的異常,但在緊接下來的方法體又用了catch(ExceptionType et),如果產(chǎn)生了異常的話,會有什么結(jié)果呢?方法B拋出的異常馬上被自身的catch捕捉到,所以方法頭部的throws實際是沒有作用的。外層方法是接收不到方法B拋出的異常對象的。


二、在try中使用了return,在fianlly中又使用了return 

public methodB() {

 try
 {
  // 可能產(chǎn)生異常的語句
  return SOMEVALUE;
 }
 catch ()
 {
 }
 finally
 {
  return SOMEVALUE_2;
 }

}
在這個例證中,我們可以看到在try中返回了SOMEVALUE,那么程序執(zhí)行到這里是否就結(jié)束了呢,其實不是的,因為finally中的語句是肯定會被執(zhí)行到的,所以最后返回的是SOMEVALUE_2;那么意味者即使程序沒有拋出異常,最后也得不到正確的結(jié)果。


三、把catch(Exception e)放在所有catch塊的最前面
public methodB(){
 try
 {
  
 }
 catch (Exception e)
 {
  ...
 }
 catch (SubException se)
 {
  ...
 }

}
在這個例子中,catch(Exception e)被放在所有catch語句塊的最前面,因為Exception所有Exception類型的父類,所以意味著所有在try中產(chǎn)生的異常都會被捕捉到。后面其他的catch都是沒有用的,所以一定要把catch(Exception e)放在最后面,如果前面所有的異常類型都不符合,至少保證還有一個可以處理它。

 

總結(jié):
A.如果能夠找到一個有意義的方法來捕獲異常,就立即引入這個方法
B.否則就應(yīng)該考慮做某些處理后傳遞或者再次拋出異常,也可以把異常轉(zhuǎn)換為另一種形式,然后拋出一個新的異常
C.另一個方法是,可以完全忽略這個異常,而把它加到方法的頭部的throws語句中,由調(diào)用這個方法的方法來處理它
D.通過捕獲一個公共的異常超類,可以在一個塊里面捕獲多個異常,但不能夠用一個空的catch語句 塊來完全制止一個異常。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 德惠市| 瑞昌市| 慈溪市| 南乐县| 喀喇沁旗| 米泉市| 白城市| 如皋市| 新丰县| 遂平县| 宽甸| 清水县| 繁昌县| 河南省| 阳谷县| 阜康市| 衡山县| 浏阳市| 秭归县| 乌拉特前旗| 南昌市| 翁牛特旗| 巴塘县| 平度市| 台东县| 许昌县| 广平县| 桦南县| 南漳县| 随州市| 合江县| 长顺县| 新竹市| 宣武区| 子洲县| 宁德市| 陵水| 浦城县| 靖安县| 中江县| 荥经县|