2017-08-31 56 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是可取的。