我正在嘗試初始化一個 Runnable 數組,然后運行它們的代碼。我需要初始化盡可能具有可讀性,因此我為此使用了 Lambda 表達式?,F在我不知道如何解決異常問題。如果 Runnables 中的某些代碼拋出已檢查的異常,我想將其自動包裝到 RuntimeException 中,但不將 try/catch 邏輯放入每個 Runnable 主體中。代碼如下所示:public void addRunnable(Runnable ... x); // adds a number of Runnables into an array...addRunnable( ()->{ some code; callMethodThrowsException(); // this throws e.g. IOException }, ()->{ other code; } // ... and possibly more Runnables here);public void RunnableCaller(List<Runnable> runnables) { // Now I want to execute the Runnables added to the array above // The array gets passed as the input argument "runnables" here for(Runnable x: runnables) { try { x.run(); } catch(Exception e) { do some exception handling } }}代碼無法編譯,因為 callMethodThrowsException 拋出了一個已檢查的異常,而 Runnable 沒有,所以我必須在 Runnable 定義的內部插入一個 try/catch 塊。try/catch 塊會使這件事變得不那么方便,因為我必須將它放入每個 Runnable 主體聲明中,這將難以閱讀且編寫起來令人不快。我也可以創建自己的 Runnable 類來拋出異常,但是我不能使用 Lambda 表達式 ()-> 這使得它簡短易讀而不是做new ThrowingRunnable() { public void run() throws Exception { some code; } }有沒有辦法定義我自己的功能接口來解決這個問題,以便我可以使用相同的代碼,但異常將被包裝到例如 RuntimeExceptions 等中?我可以完全控制調用代碼,因此在那里捕獲異常沒有問題,我只需要一種非常易讀的編寫稍后將執行的代碼的方式。我看到了這個話題拋出異常的 Java 8 Lambda 函數?但我沒有想出如何解決我的問題,我對功能接口不是很熟悉。可能有人可以幫忙,謝謝。
1 回答

翻過高山走不出你
TA貢獻1875條經驗 獲得超3個贊
Lambda 不僅用于 JVM 提供的接口。它們可用于精確定義一個且僅一個抽象方法的每個接口。所以你可以自己創建一個接口,你已經命名了它:
public interface ThrowingRunnable{
void run() throws Exception;
}
然后替換方法中的Parameter類型addRunnable:
public void addRunnable(ThrowingRunnable... runnables){ ... }
然后讓這個編譯:
addRunnable(
()->{
some code;
callMethodThrowsException(); // this throws e.g. IOException
},
()->{
other code;
}
// ... and possibly more Runnables here
);
添加回答
舉報
0/150
提交
取消