1. 程式人生 > >try-catch-finally程式碼塊遇上return

try-catch-finally程式碼塊遇上return

這裡打算用一個Java讀取檔案內容的例子來測試,檔案存在,不拋異常,檔案不存在,則丟擲FileNotFoundException;

 

Java讀取檔案程式碼如下:

 

/**
     * 根據路徑和檔名獲取內容
     * @param filePath
     * @param fileName
     * @return
     */
    public Object findFileContentByName(String filePath, String fileName) {
        InputStream in = null;
        Scanner scanner 
= null; try { in = new FileInputStream(filePath + "/" + fileName); scanner = new Scanner(in); StringBuffer stringBuffer = new StringBuffer(); if(scanner.hasNext()){ String s = scanner.nextLine(); stringBuffer.append(s).append(
"\n"); } log.info("stringBuffer.toString()"); return stringBuffer.toString(); }catch (FileNotFoundException e){ e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { log.info("Close stream!");
try { if(scanner != null){ scanner.close(); } if(in != null){ in.close(); } }catch (IOException e){ e.printStackTrace(); } } log.info("Preparing return null"); return null; }

 

程式碼很簡單,就是傳入檔案的路徑和檔名(包括檔案字尾名),來獲取檔案內容;

當我們傳入一個在該路徑下存在的檔案時,不會拋異常,日誌如下圖:

 

當我們傳入一個不存在該路徑下的檔案時,會丟擲異常,日誌如下圖(堆疊資訊太長只截取了部分):

 

總結

 在try-catch-finally程式碼塊中,有多個return時:

如果程式碼沒有丟擲異常,以第一個return返回(本例中的return在try中),並且finally程式碼塊還會被執行;

如果程式碼塊丟擲異常,應該也是以第一個return返回,並且finally程式碼塊還會被執行;

finally程式碼塊的執行不一定是最後執行的,比如本例子中,由於丟擲異常後,無return,接著執行finally,finally程式碼塊執行完後,函式還有程式碼,列印了日誌,然後return null。

 

總的來說,不管程式碼有沒有丟擲異常,程式碼塊執行的順序是

如果程式碼執行到第一個return時,未執行finally程式碼塊,則執行完第一個return,緊接著執行finally程式碼塊,執行完finally後,不再執行該函式任何程式碼;

如果程式碼執行到第一個return時,已經執行完finally程式碼塊,則緊接著執行第一個return後,不再執行該函式任何程式碼;

如果finally函式程式碼塊後面沒程式碼,則執行完finally程式碼塊,不再執行該函式任何程式碼

注意:第一個return不是函式程式碼的順序,而是程式碼執行過程中遇到的第一個return!