国产成人v爽在线免播放观看,日韩欧美色,久久99国产精品久久99软件,亚洲综合色网站,国产欧美日韩中文久久,色99在线,亚洲伦理一区二区

學(xué)習(xí)啦 > 知識大全 > 知識百科 > 百科知識 > java中try語句和throw的區(qū)別

java中try語句和throw的區(qū)別

時間: 映芳735 分享

java中try語句和throw的區(qū)別

  在編程的時候往往會出現(xiàn)系統(tǒng)編譯時無法檢測到的錯誤,可是在運(yùn)行時會出錯,如果在可能出錯的地方拋出異常,那樣便嚴(yán)整了代碼的正確性.比如數(shù)組越界,分母為0,文件等。 編程中會用try語句和throw語句來對編程運(yùn)行過程中出現(xiàn)的異常情況進(jìn)行處理。那么這兩種有什么區(qū)別呢?下面小編帶你去了解一下。

  Java通過面向?qū)ο蟮姆椒ㄟM(jìn)行異常處理,把各種不同的異常進(jìn)行分類,并提供了良好的接口。在Java中,每個異常都是一個對象,它是Throwable類或其它子類的實例。當(dāng)一個方法出現(xiàn)異常后便拋出一個異常對象,該對象中包含有異常信息,調(diào)用這個對象的方法可以捕獲到這個異常并進(jìn)行處理。

  Java的異常處理是通過5個關(guān)鍵詞來實現(xiàn)的:try、catch、throw、throws和finally。一般情況下是用try來執(zhí)行一段程序,如果出現(xiàn)異常,系統(tǒng)會拋出(throws)一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最后(finally)由缺省處理器來處理。

  用try來指定一塊預(yù)防所有“異常”的程序。緊跟在try程序后面,應(yīng)包含一個catch子句來指定你想要捕捉的“異常”的類型。

  throw語句用來明確地拋出一個“異常”。throws用來標(biāo)明一個成員函數(shù)可能拋出的各種“異常”。

  Finally為確保一段代碼不管發(fā)生什么“異常”都被執(zhí)行一段代碼。可以在一個成員函數(shù)調(diào)用的外面寫一個try語句,在這個成員函數(shù)內(nèi)部寫另一個try語句保護(hù)其他代碼。

  每當(dāng)遇到一個try語句,“異常”的框架就放到堆棧上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種“異常”進(jìn)行處理,堆棧就會展開,直到遇到有處理這種“異常”的try語句。

  try和throw的區(qū)別

  try:出現(xiàn)在方法體中,它自身是一個代碼塊,表示嘗試執(zhí)行代碼塊的語句。如果在執(zhí)行過程中有某條語句拋出異常,那么代碼塊后面的語句將不被執(zhí)行。

  throw:出現(xiàn)在方法體中,用于拋出異常。當(dāng)方法在執(zhí)行過程中遇到異常情況時,將異常信息封裝為異常對象,然后throw。

  補(bǔ)充throws和catch語句

  throws:出現(xiàn)在方法的聲明中,表示該方法可能會拋出的異常,允許throws后面跟著多個異常類型

  catch:出現(xiàn)在try代碼塊的后面,自身也是一個代碼塊,用于捕獲異常try代碼塊中可能拋出的異常。catch關(guān)鍵字后面緊接著它能捕獲的異常類型,所有異常類型的子類異常也能被捕獲。

  小編舉例

  package book.exception;

  /**

  * 拋出異常和聲明異常

  * @author joe

  *

  */

  public class ThrowAndThrows {

  /**

  * 計算一個數(shù)字的平方根

  * @param nStr 以字符串的形式提供數(shù)字

  * @return 返回平方根

  * @throws Exception 當(dāng)用戶輸入的字符串為空,

  * 或者字符串無法轉(zhuǎn)換成數(shù)字,或者轉(zhuǎn)換成的數(shù)字小于0,都會拋出異常

  */

  public static double sqrt(String nStr) throws Exception {

  if (nStr == null) {

  //用trow關(guān)鍵字拋出異常,當(dāng)異常被拋出時,程序會跳出該方法

  throw new Exception("輸入的字符不能為空!");

  }

  double n = 0;

  try {

  n = Double.parseDouble(nStr);

  } catch(NumberFormatException e) {

  //將parseDouble方法可能拋出的異常NumberFormatException捕獲,

  //然后將捕獲的異常重新封裝并輸出

  throw new Exception("輸入的字符串必須能夠轉(zhuǎn)化成數(shù)字!", e);

  }

  if (n < 0 ){

  throw new Exception("輸入的字符串轉(zhuǎn)化成的數(shù)字必須大于0!");

  }

  return Math.sqrt(n);

  }

  public static void main(String[] args) throws Exception {

  try{

  ThrowAndThrows.sqrt("-124.56");

  } catch(Exception e) {

  //將sqrt方法聲明的可能拋出的Exception異常捕獲

  //打印捕獲的異常的堆棧信息,從堆棧信息中可以發(fā)現(xiàn)異常發(fā)生的位置和原因

  System.out.println("Got a Exception:" + e.getMessage());

  e.printStackTrace();

  throw e; //不做進(jìn)一步處理,將異常向外拋出

  }

  //將sqrt聲明了可能會拋出的異常向外拋出,必須在方法聲明中使用throws

  ThrowAndThrows.sqrt("-124.56");

  }

  }

  程序輸出結(jié)果:

  Got a Exception:輸入的字符串轉(zhuǎn)化成的數(shù)字必須大于0!

  java.lang.Exception: 輸入的字符串轉(zhuǎn)化成的數(shù)字必須大于0!

  at book.exception.ThrowAndThrows.sqrt(ThrowAndThrows.java:30)

  at book.exception.ThrowAndThrows.main(ThrowAndThrows.java:37)

  Exception in thread "main" java.lang.Exception: 輸入的字符串轉(zhuǎn)化成的數(shù)字必須大于0!

  at book.exception.ThrowAndThrows.sqrt(ThrowAndThrows.java:30)

  at book.exception.ThrowAndThrows.main(ThrowAndThrows.java:37)

  源碼分析:

  在main方法里,由于sqrt方法的聲明中有throws關(guān)鍵字,所以,在調(diào)用該方法時,必須對throws后面聲明的異常進(jìn)行處置,處置的方法有兩種:

  (1)main方法處理該異常,使用try.....catch語句,將可能會出現(xiàn)的異常的代碼放在try塊內(nèi),將處理異常的代碼放在catch塊內(nèi),并指明catch能夠捕獲的異常的類型,當(dāng)異常被捕獲時,執(zhí)行catch塊內(nèi)的語句。

  (2)main方法不處理該異常,將異常向外層程序拋出。在方法聲明中使用throws關(guān)鍵字拋出異常,方法體中不需要使用try...catch語句。

  異常類Exception的getMessage方法用來獲取一場的描述信息,printStackTrace方法用來打印異常的堆棧信息,通過堆棧信息能夠查明異常發(fā)生的原因和位置,在調(diào)試的時候常用。

537257