使用接口处理异常

时间:2015-09-08 15:48:22

标签: java

所以,我正在编写一些连接接口。例如,定义了一个可以使用套接字,串行IO或其他接口实现的接口。

套接字和串行连接都有不同的例外。

通常,当我实现某些内容时,我会使用throws来声明异常。

然而,在接口的情况下是一个问题。接口是否应声明抛出Socket相关和串行等相关的异常并始终处理所有异常?

我该怎么办?

谢谢。

3 个答案:

答案 0 :(得分:2)

只需定义以与流api相同的方式抛出IOException的接口。然后,您可以在实现中使用特定详细信息(套接字断开连接等)从IOException定义扩展类型。

答案 1 :(得分:0)

接口方法默认是公共抽象,可以抛出任何你想要的throwable(包含)的子类,但是在实现方法时,方法签名应该抛出相同的异常,该异常的子类或者没有

在您的情况下,您的界面看起来像这样,以及您可能拥有的任何其他方法(默认/静态或抽象)。

interface network{
    void connect() throws IOException;
}

答案 2 :(得分:0)

一般来说,无论何时定义接口,您提供的方法都应该抛出在您的API将被使用的上下文中有意义的异常。如果您的API用户不在处理非常特定的异常(在您的情况下为套接字或序列异常)的级别,那么实际上正如其他人已正确声明的那样,将它们包装在“更广泛”的异常中是您最好的解决方案。

请注意,在您的界面定义中添加throws子句会对您的代码或客户代码产生一些影响。

给出以下界面:

public interface MyInterface {
    void doSomething () throws IOException;
}

如果他们通过界面调用该方法,您的API的用户将被强制将doSomething ()的调用包围try/catch(或抛出调用方法的异常)。 E.g:

public class MyImplementation implements MyInterface {
    @Override
    public void doSomething () {
        /*
         * It is legal to override a method defined in the interface and not throw
         * the exception(s) that were defined in the interface definition.
         */
    }
}

public class OtherClass {
    public static void main (String[] args) {
        MyInterface object = new MyImplementation ();
        object.doSomething (); // Compilation error here since IOException is not handled.
    }
}

永远记住,在定义界面时,您正在设置一个实现类和API用户必须使用的合同。因此,请确保您在界面中定义的任何内容都是必要的,而不是“如果我曾经需要这样做”的情况。