1. 程式人生 > >try-catch-finally的用法之finally

try-catch-finally的用法之finally

關於try-catch-finally的用法我就不多說了。網上搜一下,資料很多。

這裡我想主要討論下在finally塊加入return語句遮蔽異常的問題。

我們先來看這樣一段程式碼,

程式碼1

以上程式碼在Eclipse裡是不會編譯通過的,因為在catch塊中throw了一個異常,而print方法並沒有宣告要丟擲異常。

現在我們修改程式碼,讓它能夠通過編譯,程式碼2

就是在printmain方法後加throws Exception,然後執行,看執行結果:

程式先是走到了catch塊的第一句,列印了at catch block step 1.

但並沒有緊接著去throw e即沒有立刻丟擲這個異常,之所以這樣說,是因為異常的資訊是在finally塊的列印資訊之後才打印的。

這個例子告訴我們,finally不管出異常與否,都必行的代(如果中途終止了jvm,就不必去執行了)

那麼何時執行finally塊中的程式碼呢?

在這個例子中,try塊中有異常丟擲,所以finally塊中的程式碼是在執行了catch語句之後、退出方法之前被執行的(如果這裡執行了throw e,則方法就退出了)

下面再看另外一個程式碼,程式碼3

這段程式碼與之前相比,在finally塊中增加了return語句

雖然在catch塊中有throw e語句,但在print方法後並不用宣告throws Exception,也可以通過編譯。

因為在try塊中有Thread.sleep(1);語句,所以必須要捕獲InterruptedException,但在這種情況下,即使我們把catch塊去掉了,也不會有問題,這是怎麼回事呢?

因為在finally塊中的return語句遮蔽了異常。

經過程式碼2我們已經知道了,異常在finally塊被執行之前,雖然會執行catch塊中的程式碼,但並不會退出方法,在退出方法之前,會轉向finally塊中執行,而在finally塊中又恰好有return語句,所以方法就正常退出了,在try塊中產生的異常就不會有機會被丟擲。

相關推薦

try-catch-finally用法finally

關於try-catch-finally的用法我就不多說了。網上搜一下,資料很多。 這裡我想主要討論下在finally塊加入return語句,遮蔽異常的問題。 我們先來看這樣一段程式碼, 程式碼1: public class FinallyTest { public st

PHP中try catch用法

tro sta main 面向對象 and cau pub 展示 添加 異常(Exception)用於在指定的錯誤發生時改變腳本的正常流程。 什麽是異常? PHP 5 提供了一種新的面向對象的錯誤處理方法。 異常處理用於在指定的錯誤(異常)情況發生時改變腳本的正常流程

2個簡單實例讓你快速理解try-catch用法

分享圖片 代碼塊 button mage 理解 bsp click pan 簡單   相信在實際項目中,你可能經常會看到類似下面的代碼 try { // 嘗試執行代碼塊 } catch(err) { // 捕獲錯誤的代碼塊 } finally {

JS中try.. catch..的用法

    try 測試程式碼塊的錯誤。 catch 語句處理錯誤。 throw 建立並跑出錯誤。 try { //在這裡執行程式碼 丟擲錯誤 } catch(err) {

try ...... catch用法

function fn(x) { try { if(x == "") throw "為空"; if(isNaN(x)) throw "不是一個數字"; if(x > 10) throw "太大了"; if(x <

Java的try...catch用法和作用(為什麼要用try...catch

當程式執行過程中發生錯誤時,就會“ 丟擲異常',丟擲異常比終止程式要靈活得多,這是因為可以提供一個“ 捕獲” 異常的處理器 (handler) 對異常情況進行處理。 如果沒有提供處理器,程式就會終止,並在控制檯上打印出一條資訊, 其中給出了異常的型別。可能在前面已經看到過一

c# try catch finaly用法

trycatchfinally1、將預見可能引發異常的程式碼包含在try語句塊中。2、如果發生了異常,則轉入catch的執行。catch有幾種寫法:catch這將捕獲任何發生的異常。catch(Exception e)這將捕獲任何發生的異常。另外,還提供e引數,你可以在處理異

Python學習記錄----一篇關於python程式設計中try catch用法,個人覺得java也是通用的

    關於異常處理的幾點意見 1.如果異常的數量少於20個,在哪裡處理沒有多大區別,如果有100個,就不一樣了 2.如果except什麼也不做,僅僅是pass,那為什麼還用try呢?return erron_code是C語言的處理方式,不應該用在面嚮物件的技術裡面,難道

Java異常捕獲一道try-catch-finally語句題

span pri div system 處理機 out nal exception for 今天,學習了try-catch-finally語句,本來覺得蠻簡單、易懂的。搜了一道相關類型的題。結果信心被潑了盆冷水。先把題Mark一下,出去透透風。 1 public cla

Java中 try--catch-- finally、throw、throws 的用法

一、try {..} catch {..}finally {..}用法 try {   執行的程式碼,其中可能有異常。一旦發現異常,則立即跳到catch執行。否則不會執行catch裡面的內容 } catch (Exception e) {  除非try裡面執行程式碼發生了異常,否則這裡的程式碼不會執行 }

java集合總結,異常(try...catch...finally,丟擲throws)

一. 集合總結 1. 單列集合 (Collection) 1.1 執行緒不安全的 jdk1.2 ArrayList 查詢快 增刪慢(相對) LinkedList 查詢慢 增刪快(相對) HashSet 去重 TreeS

try catch finally 用法

在講之前我們先看一段程式: public class Test { public static void main(String[] args) { System.out.println("return value of getValue(): "

演算法try-catch-finally-看程式寫結果”

程式碼: public calss Test{ public static void main(String[] args){ try{ test(new int[]{0,1,2,3,4,5,6}); }cat

try catch finally 用法 今天閒來沒事就總結下

try {  執行的程式碼,其中可能有異常。一旦發現異常,則立即跳到catch執行。否則不會執行catch裡面的內容 } catch { 除非try裡面執行程式碼發生了異常,否則這裡的程式碼不會執行 } finally { 不管什麼情況都會執行,包括try catch 裡面用了return ,可以理解

js 系統教程-17-js 語法異常處理-error,自定義異常,try catch finally

目錄 錯誤處理機制 Error 例項物件 JavaScript 解析或執行時,一旦發生錯誤,引擎就會丟擲一個錯誤物件。JavaScript 原生提供Error建構函式,所有丟擲的錯誤都是這個建構函式的例項。 var err = new

Java異常處理中try,catch,finally的各種組合用法

1.try+catch 程式的流程是:執行到try塊中,如果有異常丟擲,則轉到catch塊去處理。然後執行catch塊後面的語句  2.try+catch+finally 程式的流程是:執行到try

Java解惑try catch finally

此文起因是由於論壇中出現的這兩個討論貼: 至於這個問題是否值得深究我們不做討論,人跟人觀點不一樣,我就覺得很有意思,所以可以試著分析一下。 不過要提前說明一下,可能有的地方我的理解並不正確或者措辭並不恰當,還希望高手指正。 首先,還是先看下問題,程式碼如下: Java程式碼   priva

try catch finally用法,你知道多少?最詳細、最到位的講解,配合程式碼例項講解,讓你輕鬆掌握和理解

廢話就不多說了,關於 try catch 相信各位已經不陌生了,但是真正意義上會用它呢,還是有欠缺的,為什麼這麼說呢?因為博主也 是在做一個專案的時候遇到了這樣的問題,去看了下 API 才想起來,於是乎就順便寫了這篇部落格分享出來,方便大家觀看和學習以 及理解,等下筆者會按

Android面試java基礎try-catch-finally-return的執行先後順序問題

還是一個被個程式猿們討論多時的問題,也是眾軟體公司面試題中很鍾情的一個問題,更是一個考查程式猿對Java基礎知識掌握理解程度的問題,就是本文要說的try-catch-finally-return的執行先後順序問題 先說明幾個原則 。 1、不論是否能捕捉到異常,fin

C++異常處理:try,catch,throw,finally用法

很多window系統有C-like介面,使用象like createWindow 和 destroyWindow函式來獲取和釋放window資源. 如果在w對應的window中顯示資訊時,一個異常被丟擲,w所對應的window將被丟失,就象其它動態分配的資源一樣. 解決方法與前面所述的一樣,建立一個類