【问题标题】:Throwing multiple exceptions in a method of an interface in java在java中接口的方法中抛出多个异常
【发布时间】:2010-01-30 18:25:14
【问题描述】:

我想问一下如何在我的界面中提及这个

public class find(int x) throws A_Exception, B_Exception{
----
----
---
}

我想说我可以在接口中提及一个异常,但是如何在我的界面中提及我的方法将抛出两个异常,即 A 和 B...

上面提到的代码片段只适用于A,不适用于B...帮助

public interface dictionary{ 
   public void insert(int x) throws Dictionary_FullException, Duplicate_Element_FoundException; 
}
...
 public class SortedArray implements dictionary{ 
   public void insert(int x) throws Dictionary_FullException, Duplicate_Element_FoundException {
 ---------
}

但是当我编译它时......它说......

SortedArray.java:66: 插入(int) assign.SortedArray 无法实现 在assign.dictionary中插入(int); 被覆盖的方法不会抛出 assign.SortedArray.Duplicate_Element_FoundException 公共 无效插入(int x)抛出 Dictionary_FullException

【问题讨论】:

  • public class find(int x),它编译过吗?这与接口有什么关系?

标签: java


【解决方案1】:

您可以为您的接口方法声明任意数量的异常。但是您在问题中给出的课程无效。它应该是

public class MyClass implements MyInterface {
  public void find(int x) throws A_Exception, B_Exception{
    ----
    ----
    ---
  }
}

那么界面应该是这样的

public interface MyInterface {
  void find(int x) throws A_Exception, B_Exception;
}

【讨论】:

    【解决方案2】:

    我认为您要求的内容类似于以下代码:

    public interface A
    {
        void foo() 
            throws AException;
    }
    
    public class B
        implements A
    {
        @Overrides 
        public void foo()
            throws AException,
                   BException
        {
        }
    }
    

    除非 BException 是 AException 的子类,否则这将不起作用。当你重写一个方法时,你必须符合父提供的签名,并且异常是签名的一部分。

    解决办法是声明接口也抛出BException。

    原因是你不想要这样的代码:

    public class Main
    {
        public static void main(final String[] argv)
        {
            A a;
    
            a = new B();
    
            try
            {
                a.foo();
            }
            catch(final AException ex)
            {
            }
            // compiler will not let you write a catch BException if the A interface
            // doesn't say that it is thrown.
        }
    }
    

    如果 B::foo 抛出 BException 会发生什么?该程序将不得不退出,因为它可能无法捕获。为了避免这种情况,子类不能改变抛出的异常类型(除了它们可以从列表中删除异常)。

    【讨论】:

      【解决方案3】:

      您需要在可以抛出异常的方法上指定它。如果它可以抛出超过一种类型的异常,你只需用“,”分隔它们。 例如

      public interface MyInterface {
        public MyObject find(int x) throws MyExceptionA,MyExceptionB;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-07-11
        • 2013-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多