官方解答 · 置頂Java
官方解答|資源事件統計
官方解答|資源事件統計
解題思路
在同一個 try-with-resources 中按 R0 到 R2 建立 Tracked。body 的失敗條件為 bodyFail && flag;本題所有資源的 close 均不拋例外。直接交由 Java 執行反向關閉並維護主例外與 suppressed,最後整理[完整事件數, 主例外加suppressed總數]。
正確性與邊界
主體失敗時 body 為主例外,關閉錯依反向關閉順序加入 suppressed;主體成功但關閉失敗時,第一個關閉錯成為主例外。沒有例外才記 success,finally 永遠最後記錄。每次呼叫各有自己的事件清單,重入不污染。
複雜度
本題固定 3 個資源,時間與額外空間 O(1)。
公開範例
輸入 {"bodyFail": true, "closeFail": false, "flag": false},依上述步驟得到 [9, 0]。
下方程式可直接取代起始碼;使用 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<Integer> 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 && false);
Tracked r2 = new Tracked("R2",events,closeFail && false)) {
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 Arrays.asList(events.size(),messages.size());
}
}
留言討論 0
登入 後就能留言,一起討論不同的寫法。