桃花長(zhǎng)相依
2023-03-09 16:44:22
我有一個(gè)加載屬性文件的 InputStream。通常我使用properties.load(is);但我想將它更改為 Consumer 因?yàn)槲蚁氡苊馐褂?catches 所以我創(chuàng)建了一個(gè)避免 id 的 ThrowingConsumer,但問(wèn)題是即使我使用普通的 Consumer 它似乎在我聲明時(shí)工作一個(gè) InputStream,但我的 ThrowingConsumer 是通用的,所以它看起來(lái)像那樣@FunctionalInterfacepublic interface ThrowingConsumer<T, E extends Throwable>{ void accept(T t) throws E; static <T, E extends Throwable> Consumer<T> unchecked(ThrowingConsumer<T, E> consumer) { return t -> { try { consumer.accept(t); } catch (Throwable e) { throw new UnsupportedOperationException(e); } }; }}當(dāng)我使用ThrowingConsumer.unchecked(properties::load).accept(is);它時(shí),它尖叫著無(wú)法解析方法加載。我怎么能避免呢?
1 回答

慕蓋茨4494581
TA貢獻(xiàn)1850條經(jīng)驗(yàn) 獲得超11個(gè)贊
load() 方法被重載,因此推理無(wú)法在兩個(gè)重載之間進(jìn)行選擇。
使用 lambda:
ThrowingConsumer.unchecked((InputStream i) -> properties.load(i)).accept(is);
或?qū)⒛姆椒ㄒ棉D(zhuǎn)換為正確的類型:
ThrowingConsumer.unchecked((ThrowingConsumer<InputStream, IOException>) properties::load).accept(is);
坦率地說(shuō),我認(rèn)為你在這里濫用消費(fèi)者,一個(gè)好的舊 try catch 塊會(huì)讓事情更容易閱讀。當(dāng)您無(wú)法從 InputStream 讀取時(shí),UnsupportedOperationException 也根本不是要加載的正確異常。UncheckedIOException 會(huì)干凈得多。而且您的消費(fèi)者還會(huì)捕獲它不應(yīng)該捕獲的異常(例如 NullPointerException 或 OutOfMemoryError 等),甚至沒(méi)有鏈接原始原因,這使得在運(yùn)行時(shí)診斷問(wèn)題變得非常困難。
添加回答
舉報(bào)
0/150
提交
取消