处理接口异常

  • 本文关键字:异常 接口 处理 java
  • 更新时间 :
  • 英文 :


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

套接字和串行连接都有不同的异常。

通常,当我实现某些东西时,我让方法使用throws声明异常。

在接口的情况下,这是一个问题。接口是否应该声明套接字相关和串行等相关的异常都被抛出并处理它们,所有的时间?

我该怎么办?

谢谢。

就像流api那样定义抛出IOException的接口。然后你可以在你的实现中定义带有特定细节(套接字断开等)的IOException扩展类型。

接口方法在默认情况下是公共抽象的,可以抛出任何你希望抛出的可抛出对象(包括)的子类,但是在实现该方法时,方法签名应该抛出相同的Exception,该异常的子类,或者不抛出。

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

interface network{
    void connect() throws IOException;
}

一般来说,无论何时定义接口,所提供的方法都应该只抛出在将要使用API的上下文中有意义的异常。如果API的用户没有达到处理非常具体的异常(在您的情况下是套接字或串行异常)的级别,那么正如其他人正确指出的那样,将它们包装在"更广泛"的异常中是您的最佳解决方案。

请记住,在接口定义中添加throws子句对您的代码或客户端的代码都有一定的影响。

给定以下接口:

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

API的用户将被迫用try/catch包围doSomething ()调用(或抛出异常到调用方法),如果他们通过接口调用该方法。例如:

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的用户必须与之共存。所以要确保你在接口中定义的任何东西都是必要的,而不是"如果我需要这个怎么办"的情况。

最新更新