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

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

廢話就不多說了,關於 try catch 相信各位已經不陌生了,但是真正意義上會用它呢,還是有欠缺的,為什麼這麼說呢?因為博主也

是在做一個專案的時候遇到了這樣的問題,去看了下 API 才想起來,於是乎就順便寫了這篇部落格分享出來,方便大家觀看和學習以

及理解,等下筆者會按順序講解,以及結合專案模組案例分析結合的使用,讓大家理解起來更簡單更透徹,而不是一大堆的字,看

起來眼睛都花了,好了我們先按順序來

① 都帶 return 的情況(程式正常執行的情況下)

    public static void main(String args[]) {
    	System.out.println("main:"+TryCatchTest());
    }

    static int TryCatchTest(){
    	int value = 10;
    	try {
    		for(int i=10;i<11;i--){
    			if(i>0){
    					value = value-i;
    					System.out.println("for i="+i+" value:"+value);
    			}
    		}
    		System.out.println("---------- try value:"+value);
    		return value;
    	} catch (Exception e) {
    		System.err.println(e.toString()+"\n---------- catch value:"+value);
    		return value;
    	} finally{
    		System.out.println("---------- finally value:"+value);
    		return 7;
    	}
    }

執行結果:
for i=10 value:0
for i=9 value:-9
for i=8 value:-17
for i=7 value:-24
for i=6 value:-30
for i=5 value:-35
for i=4 value:-39
for i=3 value:-42
for i=2 value:-44
for i=1 value:-45
---------- try value:-45
---------- finally value:-45
main:7
可以看到程式正常執行情況下的列印,for 執行完之後,value 最後的值是 -45 ,try 裡面 return 的也是 -45 ,之後會走到 finally 

下執行 finally 的程式碼 ,如果 finally 裡面寫了 return 程式就會直接返回這個值,所以 main 裡列印的是 finally 的 return 值,下

面我們在來測試 finally 塊不新增 return 的情況,只在裡面寫一些測試程式碼段,我們直接看看輸出結果:

for i=10 value:0
for i=9 value:-9
for i=8 value:-17
for i=7 value:-24
for i=6 value:-30
for i=5 value:-35
for i=4 value:-39
for i=3 value:-42
for i=2 value:-44
for i=1 value:-45
---------- try value:-45
---------- finally value:-45
main:-45

我把 finally 模組裡的 return 遮蔽掉了,裡面的 print 執行了,但 main 最終返回的是 try 模組的 return 值,所以結果就很明顯

了,程式執行正常時,如果 finally 添加了 return ,程式就直接 return finally 模組下的值,且執行 finally 塊的程式碼,下面我們繼

續往下走

②都帶 return 的情況(程式出現異常的情況下)

    public static void main(String args[]) {
    	System.out.println("main:"+TryCatchTest());
    }

    static int TryCatchTest(){
    	int value = 10;
    	try {
    		for(int i=10;i<11;i--){
    			if(i==3){
    			value = value/0;
    		}
    			if(i>0){
    					value = value-i;
    					System.out.println("for i="+i+" value:"+value);
    			}
    		}
    		System.out.println("---------- try value:"+value);
    		return value;
    	} catch (Exception e) {
    		System.err.println(e.toString()+"\n---------- catch value:"+value);
    		return value;
    	} finally{
    		System.out.println("---------- finally value:"+value);
    		return 7;
    	}
    }
可以看見我在 for 迴圈裡面模擬了一個 ArithmeticException 的異常,達到我們測試的要求,下面我們繼續往下,先看列印結果
for i=10 value:0
for i=9 value:-9
for i=8 value:-17
for i=7 value:-24
for i=6 value:-30
for i=5 value:-35
for i=4 value:-39
java.lang.ArithmeticException: / by zero
---------- catch value:-39
---------- finally value:-39
main:7

博主模擬了 ArithmeticException 異常之後 , for 迴圈只執行到了 i = 4 ,因為等於3的時候出現了我模擬的異常,所以程式由 

try 模組直接跳到了 catch 模組 ,而且 try 模組的 return 也不會執行,因為 for 迴圈在 i = 3的時候出現了異常已經被 catch 模組

直接捕獲了,這時候的 value 的值是 -39 ,所以 catch 塊下 return 的也是 -39 ,最後在走到 finally 塊,可以看到 finally 列印的

value 的值仍舊是由 try 塊異常導致被 catch 捕獲的值也就是 -39 ,但在 finally 塊有 return ,最終 main 列印的還是 7 ,所以

最終執行的是 finally 的 return ,接著我再把 finally 的 return 註釋掉,我們繼續看列印結果,並且分析和總結

for i=10 value:0
for i=9 value:-9
for i=8 value:-17
for i=7 value:-24
for i=6 value:-30
for i=5 value:-35
for i=4 value:-39
java.lang.ArithmeticException: / by zero
---------- catch value:-39
---------- finally value:-39
main:-39

博主註釋掉 finally 塊的 return 語句之後,finally return 語句之前的程式碼仍舊執行了,但最終 return 的是由 catch 捕獲的 try 

塊的異常 value 值 -39 ,看到這裡,相信大家都已經明白了吧?就是程式不管異常與否,最終都會執行 finally 裡面的程式碼,如果

finally 塊裡面有 return 語句,預設返回 finally 塊 return 的值,如果去掉 finally 的 return 語句,程式最終返回的值由程式的異

常與否絕對,比如程式正常,由 try 決定,程式意外出現異常,將由 catch 的返回值取決

倘若,try catch finally 都沒有 return 語句,就根據函式的返回值而定(排除 finally 塊添加了return 語句),比如程式的方法返回

一個 int 值,如果正常,最終返回  try 裡面被賦予值的 int 變數,反之異常則由 catch 決定,你可以在 catch 塊獲取此 int 值,或

者做一些你自己想要處理的邏輯

看到這裡之後你對 try catch finally 到底掌握了多少呢?別急,下面我將結合一個例項來講一講,怎麼合理運用它們,上例項

	class PosterAsyncTask extends AsyncTask<String, Integer, List<InputStream>> {

		@Override
		protected void onPreExecute() {
			super.onPreExecute();
		}

		@Override
		protected List<InputStream> doInBackground(String... params) {

			List<InputStream> inputStream = new ArrayList<InputStream>();
			if (mUrl_List.size() > 0) {

				try {
					for (int i = 0; i < mUrl_List.size(); i++) {
						HttpGet httpRequest = new HttpGet(mUrl_List.get(i));
						HttpClient httpclient = new DefaultHttpClient();
						HttpResponse response = (HttpResponse) httpclient
								.execute(httpRequest);
						if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
							HttpEntity entity = response.getEntity();
							BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(
									entity);
							InputStream is = bufferedHttpEntity.getContent();
							if (null != is && i != 0) {
								inputStream.add(is);
							} else {
								String path = mUrl_List.get(0).substring(
										mUrl_List.get(0).lastIndexOf("/") + 1,
										mUrl_List.get(0).length());
								Log.e(TAG, "writer mp3 file... " + path);
								// writeBuffer(is, path);
							}
						}
					}
				} catch (IOException e) {
					e.printStackTrace();
				} finally {
					if (mUrl_List.size() == 0) {
						httpClient.getConnectionManager().shutdown();
					}
				}
			}
			return inputStream;

		}

		@Override
		protected void onProgressUpdate(Integer... values) {
			super.onProgressUpdate(values);
		}

		@Override
		protected void onPostExecute(final List<InputStream> result) {
			super.onPostExecute(result);

			if (result.size() > 0) {
				Message msg = mHandler.obtainMessage();
				msg.obj = result;
				msg.what = 3;
				mHandler.sendMessage(msg);
			}
		}
	}

    

PoterAsynTask 是一個下載廣告推送檔案的非同步操作,就是程式被動或主動響應來自伺服器的廣告推送請求,在客戶端需要輪播

展示這個廣告圖片組,且播放背景音樂,這些我們先撇開,直接說非同步裡的 try catch finally 相關操作

在 PoterAsynTask  被執行,筆者在 doInBackground(String... params)  new 了一個 List<InputStream> 集合來獲取非同步下載

成功之後的流,寫入檔案我們就忽略了,直接卻入主題吧,首先我們來考慮下正常情況

正常情況下,上述程式碼會把所有下載完的流存入到 List 集合,然後執行 finally 塊的程式碼,finally 塊是關閉了httpClient ,正常情

況下這樣寫一點沒錯,結果會由 onPostExecute(final List<InputStream> result) 並且通過 Handler 發

給 handleMessage(android.os.Message msg) ,然後我執行了如下操作:

			if (minputStream.size() > 0) {
				for (InputStream inputStream : minputStream) {
					mBitmapMap
							.put(key, BitmapFactory.decodeStream(inputStream));
					key++;
				}
			}

取流轉Bitmap 存快取,這裡就不考慮本地快取了,因為它不是我們部落格要講的東西,這個先不管,繼續剛才的,如果我

在 doInBackground(String... params) 執行下載的時候,突然網路斷了或者伺服器錯誤又或者網路超時了呢?這時候你要幹得事

情就不是剛剛那些了,因為那樣會出現各種錯誤,因為檔案壓根就是不完整的,程式異常的話,會走到 catch 下,那麼問題來

了,你可以在 catch 下設定一個標誌位,在 finally 下判斷這個標誌位,比如如果標誌位為 true 代表程式正常執行完畢,則關閉

httpclient ,false 則不關閉,然後在某處寫一個迴圈獲取或者被動獲取網路狀態的函式,儲存之前斷掉的位元組位,網路正常了就

繼續進行下載,前提是你要寫檔案或者存資料庫儲存上一次斷掉的位置,然後繼續寫檔案,當然這只是我舉例的一種例子,具體

操作還是要根據需求或者其他因素來決定的

本篇的 try catch finally 講解就介紹到這裡了,謝謝大家觀博!

相關推薦

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

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

try catch finally 用法

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

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

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

史上詳細完全的ipython使用教程Python使用者必備!——ipython系列之二

宣告:本文承接前面一篇文章,ipython系列之一;另外,本文所指的ipython不是ipython notebook,ipython notebook已經被jupyter notebook所取代,不再叫ipython notebook了。 前面講解了ipython裡面的一些核心

史上詳細完全的ipython使用教程Python使用者必備!——ipython系列之一

一、ipython簡介 關於什麼是ipython,本文就不加以介紹了,他是一個非常流行的python直譯器,相比於原生的python直譯器,有太多優點和長處,因此幾乎是python開發人員的必知必會。 1、ipython相比於原生的python有什麼優勢 (1) pyth

一步步教搭建Android開發環境(有圖有真相)--“自吹自擂:史上詳細囉嗦最新的搭建教程”

宣告:轉摘請註明http://blog.csdn.net/longming_xu/article/details/28241045 前言:為什麼要寫這麼一篇文章?網上介紹Android開發環境搭建的文章一片一片的,我為什麼要自己”重複的去造輪子“呢?原因有三個:第一個

史上詳細完全的jupyter notebook使用教程Python使用者必備!——ipython系列之三

一、什麼是jupyter 1、簡介: jupyter notebook是一種 Web 應用,能讓使用者將說明文字、數學方程、程式碼和視覺化內容全部組合到一個易於共享的文件中。它可以直接在程式碼旁寫出敘述性文件,而不是另外編寫單獨的文件。也就是它可以能將程式碼、文件

Git使用教程:詳細傻瓜淺顯真正手把手教!

作者:塗根華 原文出處:https://www.cnblogs.com/tugenhua0707/p/4050072.html 導讀:因為教程詳細,所以行文有些長,新手邊看邊操作效果出乎你的預料。GitHub雖然有些許改版,但並無大礙。 一:Git是什麼?    

mongodb group分組(詳細通俗理解講解

和資料庫一樣group常常用於統計。MongoDB的group還有很多限制,如:返回結果集不能超過16M, group操作不會處理超過10000個唯一鍵,好像還不能利用索引[不很確定]。    Group大約需要一下幾個引數。  1.key:用來分組文件的欄位。和k

詳細完整的相機標定講解

最近做專案要用到標定,因為是小白,很多東西都不懂,於是查了一堆的部落格,但沒有一個部落格能讓我完全能看明白整個過程,絕大多數都講的不全面,因此自己總結了一篇部落格,給自己理一下思路,也能夠幫助大家。(張正友標定的詳細求解還未完全搞明白,後面再加) 在

史上詳細全面的Hadoop環境搭建

前言 這是一篇入門文章,Hadoop的學習方法很多,網上也有很多學習路線圖。本文的思路是:以安裝部署Apache Hadoop2.x版本為主線,來介紹Hadoop2.x的架構組成、各模組協同工作原理、技術細節。安裝不是目的,通過安裝認識Hadoop才是目的。 第一部分:L

ISC BIND9 - 詳細認真的從零開始的BIND 9 服務講解

# DNS and BIND 服務的搭建說明 --- [TOC] --- ## 1. 背景 ### 1.1 DNS **DNS( Domain Name Service)** 作為一個非常讓人耳熟能詳的概念,這種技術可以把複雜難記的IP地址轉化成為一個域名供人們去呼叫,這樣人們只需要記住每一個網

再問一遍真的瞭解try..catch(finally)嗎???

定義 首先來看下 MDN 的定義: The try...catch statement marks a block of statements to try and specifies a response should an exception be thrown. try...catch語句標記要執

技術大佬:我去竟然還在用 trycatch-finally

二哥,你之前那篇 我去 switch 的文章也特麼太有趣了,讀完後意猶未盡啊,要不要再寫一篇啊?雖然用的是 Java 13 的語法,對舊版本不太友好。但誰能保證 Java 不會再來一次重大更新呢,就像 Java 8 那樣,活生生地把 Java 6 拍死在了沙灘上。Java 8 是香,但早晚要升級,我挺你

重構機房收費系統要用的——異常處理拋出異常(try catch finally)——(vb.net)

style post blue 通過 alt list bcm round 導致 你能保證你的程序不會出問題嗎? 不能 當你的程序執行到某個地方發生了你不想要的結果。你是否想讓它一錯再錯? 不想 你是否想讓你的程序占著茅坑不拉屎? 不想 你是否想知道你的程序出錯的原因?

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

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

Java中 try--catch-- finallythrowthrows 的用法

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

java 異常處理機制throws與throwtry-catch-finally

java 異常處理機制 1.Java異常處理 2.try-catch-finally的程式流程圖 3.關鍵解讀 4.demo 5.不捕獲異常時的情況 在編寫程式時,經常要在可能出現錯誤的地方

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

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

######漏發郵件問題【###終歸是程式碼問題(測試出來的-不是直接可見的邏輯問題!!!try catch finally問題)。先耐心測試自身找原因廣泛應用的都是成熟技術!

===ssm整合JavaMail:漏發郵件問題【###終歸是程式碼問題(測試出來的-不是直接可見的邏輯問題!!!try catch finally問題)。】 === ###知識點:【finally保證異常仍然需要執行的程式碼一定會執行!】 ===最後程式碼:(只需要看insertUser方法