Java接口的异常设计

一、问题的提出
  疑惑1:在设计接口的时,对于接口方法何时需要声明抛出受检异常或者说所有的接口方法最后都声明抛出受检异常?
以下是代码片段:
 public interface xx{
  public void method();
  }
  public interface xx{
  public void method() throws Exception;
  }
  疑惑2:如果需要声明抛出受检异常,那是抛出一个抽象的异常呢;还是抛出多个具体的异常?
  a,抛出抽象的异常。如果是这样那是抛出自定义抽象异常呢,还是直接抛出
Exception?
  自定义抽象异常
以下是代码片段:
 public interface xx{
  public void method() throws CustomAbstractException;
  }

  直接抛出Exception:
以下是代码片段:
   public interface xx{
  public void method() throws Exception;
  }
   b,抛出具体异常:

以下是代码片段:
 public interface xx{
  public void method() throws SpecificException1,SpecificException2,...;
  }
  ps:如果要抛出具体异常那就要考虑全部可能的实现类会抛出的异常,我想这样几乎不可能吧。
############################################################
  关于异常,这里还有一个重要的知识点:
   1、不能放大接口可能会抛出的异常:Java 中子类重写父类的方法时声明抛出异常不能比父类范围大 ,同理:实现类中的实现方法声明抛出的异常不能比接口或者抽象类中的范围大。
   2、不能缩小接口的可视性
   3、异常在向上抛得过程中,如果main方法也无法处理,jvm就会终止程序。

  二、问题的解决方案
   接口就是约定,异常是返回结果之一。
   使用不同的异常区分不同错误的情况,在方法声明中抛出所以可能的异常,即抛出具 体异常,只有在具体的实现类(非接口实现类或接口只有一个实现类的情况)中比较可行;在接口有多个不同的实现类时,不同的实现又可能抛出不同的异常,这样 就无法在接口声明中将这些具体异常全部声明出来了,这时候使用一个抽象的异常就比较可行了。可是如果这样的话,我觉的使用接口的地方,就无法明确到底会出 现哪些具体的异常了。这样貌似异常的使用原则(尽量指定具体的异常)有些相违背了。

    还有如果在接口中声明了抛出自定义的抽象异常,那么在实现类中将一些如例如网络可能中断,未知的程序错误等等,这种处理成运行时异常,是将其转译呢,还是直接抛到上异常。

  对于系统性异常:例如网络可能中断,未知的程序错误等等,这种处理成运行时
异常,不作声明比较好,反正接收的人也没办法做任何处理

  对于有业务性的错误:例如取款时,余额不够、权限不够、超出最大取款限制等
等,这类错误,最好,每个场景,定义一个异常,在申明中逐一说明,总之,异
常是帮助使用者了解、处理不同的错误场景。使用者可以根据错误类型的不同,
给用户提供不同的处理方式和流程。当然,如果你提供给用户的只是提示信息,
就没必要再区分类型了
异常处理方式上,还有一个办法是对异常编码,那就只需要一种类型了,类似
SqlException。两种方式都可行,重点是要让约定更加明确、翔实

原文地址:https://www.cnblogs.com/kabi/p/5182838.html