Contents

我多年忽略了 Java RuntimeException 觀念

最近寫 Java 發現某個 MyBatis API 報錯,文件沒有寫會丟 Exception,但是 MyBatis DB 發生錯誤就會丟…,後來發現是我當出沒看好,所以趕快記錄一下。

文章重點取自 Java筆記 — Exception 與 Error. 這是個很老梗的問題了, 但每個階段回來看, 都會有不同的體會… | by Carl | Medium,建議看大神文章,可以呼略下面筆記。 備份圖

Java 錯誤種類

Exception: 通常指程式運行時所出現的可預料之意外狀況, 基本上都要進行 catch 的動作, 然後進行相應處理, 如 IOException.

Error: 指在正常情況下, 不太可能出現的問題, 絕大部分的 Error 都會導致程式 (e.g. JVM 本身) 處於一種不正常且不可恢復的狀態. 所以對於這種情況, 你也不太需要去 catch 了, 因為也沒什麼意義. 常見的如 OutOfMemoryError / StackOverflowError 這些, 都是繼承自 Error.

Java Exception(重點)

https://imgur.com/kZ0fgK7

Checked Exception: 又稱受檢例外, 通常在原始碼中必須顯式地 catch 並且處理, 這部分算是 compile time 會檢查的部分.
Unchecked Exception: 又稱非受檢例外, 就是所謂的 RuntimeException, 常見的像是 NullPointerException, ArrayIndexOutOfBoundsException. 這種類型的例外通常是可以透過撰寫相應程式以避免的邏輯錯誤, 可以根據當下的情境來判斷是不是要 catch, 且在 compile time 並不會強制要求要 catch.

原因出在 RuntimeException

這邊RuntimeException程式執行時候才會丟 Exception ,這邊就要想想什麼時候要做 Exception ,說真的目前遇到公司都會丟 throw Exception(這邊是公司底層 Dao 都會丟 Exception),編輯器都會跟你說要add throw Exception 到 method,因為丟會防止程式問題,要怎麼處理 RuntimeException 這是一個好問題,有時間再整理。

相關 RuntimeException 文章

日常接觸 Exception 處理

Spring Boot Transactional

我常常在工作中會把 Spring Boot Transactional 交易改成Exception,公司底層也是這樣寫,是因為怕程式錯誤沒有 rollback 會造成這樣,但我想最正確寫法。

感想

大概看了一些文章,處理 DB 應該不需要處理RuntimeException,也應該不需要 Excepion,也許你改成Exception時候代表程式沒有寫好(程式單一原則),不該把Runtime Exception程式碼放在裡面。

我目前看到結果大概是這樣,有問題再補。

題外話,其實幾個月前我就有打算整理這篇,最近學 Lamdba 遇到 Exception 問題,所以想到這個還沒有整理,之後還要整理 Lamdba 怎麼處理 Exception 問題。