亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

Java 8:lambda表達式中的強制檢查異常處理。為什么是強制性的而不是可選性的?

瀏覽:81日期:2024-04-24 08:55:54
如何解決Java 8:lambda表達式中的強制檢查異常處理。為什么是強制性的而不是可選性的??

不確定我是否真的回答了您的問題,但是您不能簡單地使用類似的內容嗎?@H_301_1@

public final class supplierUtils { private supplierUtils() { } public static <T> supplier<T> wrap(Callable<T> callable) {return () -> { try {return callable.call(); } catch (RuntimeException e) {throw e; } catch (Exception e) {throw new RuntimeException(e); }}; }}public class JdbcConnectionPool extends ObjectPool<Connection> { public JdbcConnectionPool(int maxConnections, String url) {super(supplierUtils.wrap(() -> DriverManager.getConnection(url)), maxConnections); }}解決方法

我正在使用Java 8的新lambda功能,發現Java 8提供的實踐確實很有用。但是,我想知道是否有一種 很好的方法來解決以下情況。假設您有一個對象池包裝器,需要某種工廠來填充對象池,例如(使用java.lang.functions.Factory):

public class JdbcConnectionPool extends ObjectPool<Connection> { public ConnectionPool(int maxConnections,String url) {super(new Factory<Connection>() { @Override public Connection make() {try { return DriverManager.getConnection(url);} catch ( SQLException ex ) { throw new RuntimeException(ex);} }},maxConnections); }}

將功能接口轉換為lambda表達式后,上面的代碼變為:

public class JdbcConnectionPool extends ObjectPool<Connection> { public ConnectionPool(int maxConnections,String url) {super(() -> { try {return DriverManager.getConnection(url); } catch ( SQLException ex ) {throw new RuntimeException(ex); }},maxConnections); }}

確實還算不錯,但是檢查的異常java.sql.SQLException需要在lambda內部加上try/catch塊。在我公司,我們長時間使用兩個接口:

IOut<T>相當于java.lang.functions.Factory;還有一個特殊的接口,用于通常需要檢查異常傳播的情況:interface IUnsafeOut<T,E extends Throwable> { T out() throws E; }。

這兩個IOut<T>和IUnsafeOut<T>應該遷移到Java 8中被刪除,但是不存在用于精確匹配IUnsafeOut<T,E>。如果lambda表達式可以像未檢查的那樣處理已檢查的異常,則可以在上面的構造函數中像下面這樣簡單地使用它:

super(() -> DriverManager.getConnection(url),maxConnections);

看起來更干凈了。我看到可以重寫ObjectPool超類來接受我們的IUnsafeOut<T>,但是據我所知,Java8尚未完成,因此可能會有一些變化,例如:

實現類似于IUnsafeOut<T,E>?(說實話,我認為這很臟-受試者必須選擇接受什么:Factory不能兼容的方法簽名的“不安全工廠”)只是忽略了lambda中的檢查異常,因此不需要IUnsafeOut<T,E>代理嗎?(為什么不這樣做?例如,另一個重要的變化:我使用的OpenJDK javac現在不需要將變量和參數聲明為final在匿名類[功能接口]或lambda表達式中捕獲)

因此,問題通常是:有沒有辦法繞過lambda中的檢查異常,還是在Java 8最終發布之前計劃在將來進行?

更新1

嗯,據我所知,盡管參考文章的日期為2010年,但看來目前尚無辦法:BrianGoetz解釋了Java中的異常透明性。如果Java8中沒有太大變化,則可以認為是答案。Brian也說interface ExceptionalCallable<V,E extendsException>(我在IUnsafeOut<T,E extends Throwable>代碼遺留中提到的內容)幾乎沒有用,我同意他的觀點。

我還想念其他東西嗎?

標簽: java
相關文章:
主站蜘蛛池模板: 午夜一区二区在线观看 | 亚洲视频五区 | 美女一级a毛片免费观看 | 香蕉啪 | 欧美 综合 社区 国产 | 999zyz色资源站在线观看 | 久久久久一级片 | 成人精品一区二区三区校园激情 | 91短视频在线观看 | 欧美日韩91 | 善良的后裔完整视频在线观看 | 国产成人精品午夜视频' | 午夜影院一区二区 | 午夜毛片不卡高清免费 | 亚洲最黄视频 | 久久夜色撩人精品国产 | 伊人狠狠丁香婷婷综合色 | 亚洲高清毛片 | 毛片999| 秘书上班和老板啪啪中文字幕 | 中文字幕第一页在线播放 | 香蕉网站狼人久久五月亭亭 | 人人婷婷色综合五月第四人色阁 | 91秒拍国产福利一区 | 伊人久久婷婷丁香六月综合基地 | 国产剧情麻豆mv在线观看 | 亚洲欧美日韩精品永久在线 | 欧美一级专区免费大片俄罗斯 | 亚洲色图8p | 日韩大片观看网址 | 国产人成亚洲第一网站在线播放 | 亚洲黄色第一页 | 国产亚洲精品综合在线网址 | 国产精品免费观看 | 色草在线 | 亚洲国产综合精品中文第一区 | 国产一级又色又爽又黄大片 | 日韩欧美亚洲国产 | 国产高清在线精品一区在线 | 国产成人精品一区二区不卡 | 欧美国产成人在线 |