2017-08-31 34 views
0

我有一些相關的API第三方的示例代碼。它不會因return語句中的未處理異常而運行。返回虛擬接口實例?

問題:返回類型是一個接口,它的實例總是與複雜的工廠(假設我沒有訪問這些)創建的。因此,即使我以愚蠢的無用途方式處理異常,我仍然無法返回有效的虛擬對象。

public FunnyInterface calculateSomething() 
{ 
    return builder.someFunnyInterface(); // throws Exception 
} 

爲了得到這個代碼運行,有什麼我可以做不涉及:

  • 修改沿着其中calculateSomething()被稱爲路由代碼,
  • 找到API的生成器,不會拋出異常,或
  • 手動編寫的虛擬類實現該接口

+5

你的問題不在於如何處理異常,這是什麼原因造成的除外。通過不導致異常來防止異常。 – DwB

+0

如果沒有你所呼叫的方法檢查異常的聲明,然後一件很意外的是發生在被拋出一些運行時異常。檢查你的東西的初始化。 – BinaryMonkL

+1

取決於誰拋出異常,爲什麼,他們可能是沒有什麼可以做,或修復可能的一行代碼。您需要共享拋出的異常,並嘗試給出一個最小的完整,可驗證的示例。 – Tezra

回答

0

既然你寫道,你不能打電話給生成器,我猜你對FunnyInterface類型的值不感興趣,所以只需返回null

public FunnyInterface calculateSomething() { 
    try { 
     return builder.someFunnyInterface(); // throws Exception 
    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 

或者只是

public FunnyInterface calculateSomething() { 
    return null; 
} 
+0

忘記了java也有空值!我習慣於C++。 –

+0

你是幸運的與Java,如果你有這樣做與斯威夫特或科特林,它會一直很棘手。 – Xvolks

0

我建議你用包裹在一個RuntimeException一個簡單的重新拋出,所以你並不需要聲明的checked exception:

// Dummy mockup interface + function 
public static interface FunnyInterface {} 
public static FunnyInterface builder_someFunnyInterface() throws Exception { return null; } 

public FunnyInterface calculateSomething() { 
    try { 
     return builder_someFunnyInterface(); // throws Exception 
    } catch (Exception e) { 
     throw new RuntimeException(e); 
    } 
} 

我不會返回null。如果您沒有處理錯誤的有意義的方法,請將其向上傳播到確實有處理錯誤的有意義方式的級別。如果你真的想要返回null/empty,那麼使用Optional,否則拋出未經檢查的RuntimeException是可取的。