2010-01-30 22 views
12

tôi muốn hỏi rằng làm thế nào để cập đến điều này trong giao diện của tôiThrowing nhiều trường hợp ngoại lệ trong một method của một giao diện trong java

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

tôi muốn nói rằng tôi có thể đề cập đến một ngoại lệ trong một giao diện nhưng làm thế nào đề cập đến trong giao diện của tôi rằng phương pháp của tôi sẽ ném ngoại lệ Hai Cụ thể A và B ...

các đoạn mã nêu trên chỉ hoạt động cho A và không cho B ... Help

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 { 
--------- 
} 

nhưng khi tôi compi le nó ... nó nói ..

SortedArray.java:66: chèn (int) trong assign.SortedArray không thể thực hiện chèn (int) trong assign.dictionary; phương pháp ghi đè không ném assign.SortedArray.Duplicate_Element_FoundException công trống chèn (int x) ném Dictionary_FullException

+5

'lớp công khai tìm (int x)', có bao giờ biên dịch không? Và làm thế nào mà liên quan đến một giao diện? – BalusC

Trả lời

19

Bạn có thể khai báo bao nhiêu ngoại lệ như bạn muốn cho phương thức giao diện của mình. Nhưng lớp bạn đưa ra trong câu hỏi của bạn không hợp lệ. Nó nên đọc

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

Sau đó, một giao diện sẽ trông như thế này

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

Bạn cần phải xác định nó trên phương pháp có thể ném ngoại lệ. Bạn chỉ cần tách riêng chúng bằng dấu ',' nếu nó có thể ném nhiều hơn 1 loại ngoại lệ. ví dụ:

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

Tôi nghĩ rằng bạn đang yêu cầu cái gì đó như vào mã bên dưới:

public interface A 
{ 
    void foo() 
     throws AException; 
} 

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

này sẽ không làm việc trừ khi BException là một phân lớp của AException. Khi bạn ghi đè một phương thức, bạn phải tuân theo chữ ký mà phụ huynh cung cấp, và các ngoại lệ là một phần của chữ ký.

Giải pháp là tuyên bố giao diện cũng ném một BException.

Lý do cho điều này là bạn không muốn mã như:

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. 
    } 
} 

Điều gì sẽ xảy ra nếu B :: foo ném một BException? Chương trình sẽ phải thoát ra vì không thể bắt được nó. Để tránh các tình huống như các lớp con này không thể thay đổi các loại ngoại lệ được ném (ngoại trừ việc chúng có thể loại bỏ các ngoại lệ khỏi danh sách).

Các vấn đề liên quan