官方解答 · 置頂Java
官方解答|資源例外清單
官方解答|資源例外清單
解題思路
在同一個 try-with-resources 中按 R0 到 R3 建立 Tracked。body 的失敗條件為 bodyFail || flag;closeFail 為真時,只有 R1,R3 的 close 拋例外。直接交由 Java 執行反向關閉並維護主例外與 suppressed,最後整理例外訊息清單,主例外先,接著依getSuppressed順序;無例外為[]。
正確性與邊界
主體失敗時 body 為主例外,關閉錯依反向關閉順序加入 suppressed;主體成功但關閉失敗時,第一個關閉錯成為主例外。沒有例外才記 success,finally 永遠最後記錄。每次呼叫各有自己的事件清單,重入不污染。
複雜度
本題固定 4 個資源,時間與額外空間 O(1)。
公開範例
輸入 {"bodyFail": true, "closeFail": false, "flag": false},依上述步驟得到 ["body"]。
下方程式可直接取代起始碼;使用 Java 11,入口為 Solution.solve。
CodeSprout 官方解答 · 題意分析、解題步驟與完整參考程式
import java.util.*;
public class Solution {
private static class Tracked implements AutoCloseable {
private final String name;
private final List<String> events;
private final boolean fail;
Tracked(String name, List<String> events, boolean fail) {
this.name=name; this.events=events; this.fail=fail;
events.add("open:"+name);
}
public void close() throws Exception {
events.add("close:"+name);
if (fail) throw new Exception("close:"+name);
}
}
public static List<String> solve(boolean bodyFail, boolean closeFail, boolean flag) {
List<String> events = new ArrayList<>(), messages = new ArrayList<>();
try (Tracked r0 = new Tracked("R0",events,closeFail && false);
Tracked r1 = new Tracked("R1",events,closeFail && true);
Tracked r2 = new Tracked("R2",events,closeFail && false);
Tracked r3 = new Tracked("R3",events,closeFail && true)) {
events.add("body");
if (bodyFail || flag) throw new Exception("body");
} catch (Exception error) {
messages.add(error.getMessage());
events.add("caught:"+error.getMessage());
for (Throwable suppressed : error.getSuppressed()) {
messages.add(suppressed.getMessage());
events.add("suppressed:"+suppressed.getMessage());
}
} finally {
if (messages.isEmpty()) events.add("success");
events.add("finally");
}
return messages;
}
}
留言討論 0
登入 後就能留言,一起討論不同的寫法。