try{}catch的隱藏(如何優雅的實現異常塊)

2020-12-12 騰訊網

Java面試筆試面經、Java技術每天學習一點

作者:liruilong

來源:https://www.cnblogs.com/liruilong/

在項目中,我們會遇到異常處理,對於運行時異常,需要我們自己判斷處理。對於受檢異常,需要我們主動處理。

但是繁瑣的try{}caht嵌套在代碼裡,看著很不舒服,這裡我們不討論性能,就代碼來講,來看看如何將他隱藏起來。原理是不變的。變得是寫法。下面我們來看如何優雅的處理異常塊。

在這之前。你需要知道以下幾個概念:

行為參數化:

是java8提出的,函數式編程的一種思想,通過把代碼包裝為參數傳遞行為,即把代碼邏輯包裝為一個參數,傳到方法裡。

Lambda表達式:

java8提出:Lambda表達式理解為簡潔的表示可傳遞的匿名函數的一種方式,它沒有名稱,但它有函數體,參數列表,返回類型。可以拋出一個異常類型。包裝代碼邏輯為參數即使用Lambda表達式。

函數式接口:

本質上是只有一個抽象方法的普通接口,可以被隱式的轉換為Lambda表達式,需要用註解定義(@FunctionalInterface)。默認方法和靜態方法可以不屬於抽象方法,可以在函數式接口中定義。

如果函數式接口中額外定義多個抽象方法,那麼這些抽象方法籤名必須和Object的public方法一樣,接口最終有確定的類實現, 而類的最終父類是Object。因此函數式接口可以定義Object的public方法。

這句代碼想來小夥伴都不陌生。這是一個受檢異常,需要拋出一個ClassNotFoundException。

正常的寫法:

嗯,我們來看具體的實現:很簡單,我們要做的,即把當做一種行為去處理,接受一個String ,得到一個Class,所以我們要定義一個函數接口,描述這種行為。

這裡,因為我們的行為需要拋出異常。所以在接口裡也拋出異常。

然後,我們需要定義一個方法,將我們的行為作為參數傳進去,同時,捕獲一下我們的異常。

然後,我們可以調用我們的方法classFind方法,

當然。其實這種思想並不簡單的可以做捕獲異常的處理,我們來看一個Demo->文本文件轉換為字符串:

在我看來;將文本文件轉換為字符串,我們需要使用高級流包裝低級流,然後做緩存讀出來。這裡,我們不可避免的會遇到異常處理,流的關閉等操作,下面我們將這些代碼都異常起來。專心寫讀的邏輯即可。

我的思路:

我對java IO用的不是很熟,大家有好的方法請留言,相互學習:

字節流-》字符流-》字符緩存流 即 將字節流轉換為字符流之後在用高級流包裝。

所以我的思路是避免在邏輯裡出現太多的IO流關閉,和異常捕獲,專心處理讀取邏輯即可,結合以下兩種技術:

try(){}【自動關閉流,1.7支持】

lambda特性來實現【行為參數化,1.8】

執一個行為,任何BufferReader -> String的Lambda表達式都可以作為參數傳入。只要符合peocess方法的籤名即可。

執行

相關焦點

  • php中try catch捕獲異常實例詳解
    具體方法分析如下:php中try catch可以幫助我們捕獲程序代碼的異常了,這樣我們可以很好的處理一些不必要的錯誤了,感興趣的朋友可以一起來看看。PHP中try{}catch{}語句概述PHP5添加了類似於其它語言的異常處理模塊。在 PHP 代碼中所產生的異常可被 throw語句拋出並被 catch 語句捕獲。
  • 面試須知(8):C#的異常處理機制(try...catch...finally)
    在 C# 語言中異常與異常處理語句包括三種形式,即 try catch、try finally、try catch finally。在上述三種異常處理的形式中所用到關鍵字其含義如下:try:一個 try 塊標識了一個將被激活的特定的異常的代碼塊。後跟一個或多個 catch 塊。
  • java的try、catch、finally
    java如何通過異常信息定位問題原因》,可以幫助大家通過異常定位問題所在。catch的作用就是當try塊中的代碼拋出異常時,而這個異常又正好是自己負責的,那這個catch塊就開始工作了。所以,catch是流水線質檢工人,只負責自己檢驗的那部分工作。
  • 每日乾貨丨C++異常處理入門(try和catch)
    try和catch都是 C++ 中的關鍵字,後跟語句塊,不能省略{ }。try 中包含可能會拋出異常的語句,一旦有異常拋出就會被後面的 catch 捕獲。從 try 的意思可以看出,它只是「檢測」語句塊有沒有異常,如果沒有發生異常,它就「檢測」不到。catch 是「抓住」的意思,用來捕獲並處理 try 檢測到的異常;如果 try 語句塊沒有檢測到異常(沒有異常拋出),那麼就不會執行 catch 中的語句。這就好比,catch 告訴 try:你去檢測一下程序有沒有錯誤,有錯誤的話就告訴我,我來處理,沒有的話就不要理我!
  • 【編碼】C++異常處理 - try,catch,throw,finally的用法
    異常是其它對象的拷貝,這個事實影響到你如何在catch塊中再拋出一個異常.因此一個派生類異常可能被處理其基類異常的catch子句捕獲,即使同時存在有能處理該派生類異常的catch子句,與相同的try塊相對應.
  • 跟我學java編程—使用try和catch捕獲異常
    前面了解了Java異常和異常處理類,本節講述如何使用try和catch語句捕獲異常。在java中添加捕獲異常代碼時,需要把認為可能會出現異常的代碼包括在try語句塊內,處理異常的代碼包括在catch語句內。在程序執行時,如果try語句內的代碼出現錯誤,try會創建異常對象並拋出,catch捕獲異常對象,則catch語句塊內的代碼將會執行,這樣就可以處理異常錯誤了。
  • 為什麼不推薦使用try-catch-finally處理Java異常?
    1、finally不是必要條件也就是說try-catch-finally中,可以只有try-catch,也可以只有try-finally。2、假設基於try-catch-finally:第一:代碼沒有異常執行順序:try執行完整->catch不執行->finally執行第二:代碼有異常且catch進行捕獲執行順序:try執行部分->跳轉catch捕獲處理
  • try..catch 不能捕獲的錯誤有哪些?注意事項又有哪些?
    finally 塊是最終結果無論如何,都會執行的一個塊,可以在這個塊裡面做一些需要善後的事情1.1 try每個try塊必須與至少一個catch或finally塊,否則會拋出SyntaxError錯誤。 Missing catch or finally after try1.2 try..catch建議將try與catch塊一起使用,它可以優雅地處理try塊拋出的錯誤。
  • Try..Catch 不能捕獲的錯誤有哪些?注意事項又有哪些?
    今天的內容中,我們來學習一下使用try、catch、finally和throw進行錯誤處理。我們還會講一下 JS 中內置的錯誤對象(Error, SyntaxError, ReferenceError等)以及如何定義自定義錯誤。
  • 【JavaScript】try..catch 不能捕獲的錯誤有哪些?注意事項又有哪些?
    今天的內容中,我們來學習一下使用try、catch、finally和throw進行錯誤處理。我們還會講一下 JS 中內置的錯誤對象(Error, SyntaxError, ReferenceError等)以及如何定義自定義錯誤。
  • Java 中關於 try、catch、finally 中的細節分析
    然後finally語句塊裡面沒有return語句。繼續分析一下,由於try語句拋出異常,程序進入catch語句塊,catch語句塊又拋出一個異常,說明catch語句要退出,則執行finally語句塊,對t進行賦值。然後catch語句塊裡面拋出異常。
  • 三道try-catch-finally題目,面試妥妥的
    try-catch-finally題目分析:1.執行 foo(0)時,不滿足 try 語句塊中的 if 語句,所以不會拋出異常,執行 finally 語句。output=「34」2.執行 foo(1)時,滿足 try 中的 If 語句,拋出異常,在 catch 中進行異常處理,雖然有 return 語句,但是 finally 中的內容必須執行,也就是說要先執行了 finally 才進行 return 操作,return 後 output += 「4」將不會再執行。所以output="23".
  • 一分鐘打通JavaScript的try-catch
    1.2 利用try-catch來解決錯誤 從圖1-2我們能看出當try中的代碼發生錯誤時,利用catch可以進行異常處理,但是當try塊中的某一塊代碼發生錯誤時,後面的代碼將不會執行,所以我們應該儘量減少try塊的代碼
  • 一文詳解 Try 和異常的區別
    注意:finally 代碼塊並不是一定執行的,在某些情況下finally塊也會不執行。try語句後面必須緊跟 catch 代碼塊或者 finally 代碼塊(也可以兩者都存在)。但是這裡不會影響程序的運行,因為報錯的代碼位於 try 中,try 將這個錯誤捕獲到後,轉給了 catch ,catch 對這個錯誤進行了處理。try 語句塊後面的 catch 語句塊可以有零個,也可以有 1個,也可以有多個。
  • Java中關於try、catch、finally中的細節分析
    然後finally語句塊裡面沒有return語句。繼續分析一下,由於try語句拋出異常,程序進入catch語句塊,catch語句塊又拋出一個異常,說明catch語句要退出,則執行finally語句塊,對t進行賦值。然後catch語句塊裡面拋出異常。
  • java中關於try、catch、finally中的細節分析
    然後finally語句塊裡面沒有return語句。繼續分析一下,由於try語句拋出異常,程序進入catch語句塊,catch語句塊又拋出一個異常,說明catch語句要退出,則執行finally語句塊,對t進行賦值。然後catch語句塊裡面拋出異常。
  • 面試官:用一句話描述 JS 異常是否能被 try catch 捕獲到 ?
    所以,我們要做一個 「安全感」 高的碼農[狗頭][狗頭][狗頭]面試官:麻煩用一句話描述 JS 異常是否能被 try catch 到?面試官:不要背答案,麻煩用一句話描述 JS 異常是否能被 try catch 到!
  • js錯誤處理,"try..catch"
    所以,try {…} 塊內的錯誤不會殺死腳本 — 我們有機會在 catch 中處理它。讓我們來看一些例子。所以,try..catch 只能處理有效代碼中出現的錯誤。這類錯誤被稱為「運行時的錯誤(runtime errors)」,有時被稱為「異常(exceptions)」。
  • Java中如何通過try優雅地釋放資源?
    3.使用try-with-resources的好處在很久很久以前,你是不是和小明一樣每每操作輸入流、輸出流的時候,用的都是try-catch-finally代碼塊?現在,答應我好嘛,作為小明的小夥伴,看完這篇文章後,再寫代碼時,不要再將就,務必使用try-with-resources會更小明(優雅)一些。
  • Java筆試面試總結—try、catch、finally語句中有return 的各類情況
    正文本篇文章主要是通過舉例的方式來闡述各種情況,我這裡根據 try-catch-finally 語法塊分為兩種大情況討論:try-catch 語法塊和 try-catch-finally 語句塊,然後再在每種情況裡再去具體討論。