2009-11-08 3 views
1

의 서브 클래스를 슬로우로 구현 나는 다음과 같은 인터페이스 선언이 : throws로 선언 된 메서드 시그니처 Exception; 예외

public interface SomeInterface { 

    void someMethod() throws Exception; 

} 

내가이 클래스의 구현을 생성하기 위해 제 3자를 사용 (JavaCC에를 - 호기심에 대한)

생성 된 클래스의 외모를 순진이 같은 : SomeException 물론 Exception의 서브 클래스입니다

public class SomeClass implements SomeInterface { 

    public void someMethod() throws SomeException { 

    // Does something 

    } 
} 

.

놀랍게도 코드가 컴파일되지 않습니다.

누구와 관련하여 의견이 있으십니까?

감사합니다.

EDIT는 :

someMethod()에있어서에게 SomeMethod() 개명.

그것은 (죄송합니다) 내 오타 ...

편집 # 2 있었다 :

죄송합니다 모든 - 내 큰 실수. 이 예제를 작성하면 코드를 삭제해야했습니다. 나는 그 실수가 그 서명이 아닌 다른 곳에 있다는 것을 알아 채지 못했습니다. 런타임 컴파일 및 사용자 정의 클래스 로딩의 "마법"그게

...

+0

"모든 입력?" 확실한 답이있는 질문이 아닙니다. –

+0

게시 된 코드가 컴파일됩니다. 이 샘플 코드로 문제를 재현 할 수 있습니까? – Yishai

+1

내 큰 실수. 이 예제에 대한 코드를 삭제해야했기 때문에 문제가 다른 곳에서 발생했다는 사실을 알지 못했습니다 ... 정말 죄송합니다 !!!! – Yaneeve

답변

1

방법 이름이 동일하지 않기 때문에 그것은 컴파일되지 않습니다 (S 캡을 확인/것으로 someMethod)

+0

하지만 문제를 해결하면 잘 컴파일해야합니다. –

+0

그냥 StackOverflow의 오타가 ... – Yaneeve

+2

하지만이 컴파일됩니다 : 가져 오기 java.io.*; 인터페이스 SomeInterface { \t void someMethod() throws Exception; } 클래스 SomeClass를 구현 SomeInterface { 공공 무효 것으로 someMethod()가 IOException가 슬로우 { // 뭔가 합니까} } 그래서 문제가 있어야합니다에게 뭔가 다른 ...에 StackOverflow에서 –

1

자바에서는 사례가 중요합니다. 인터페이스에 someMethod이 있고 클래스에 SomeMethod이라고 표시되어 있습니다.

+0

단지 오타. .. – Yaneeve

0

왜 인터페이스 메소드가 Exception을 throw합니까? 이것은 거의 항상 잘못된 것입니다. 예외는 나머지가 확장되는 기본 유형입니다. 이 방법으로 사용하는 것은 아닙니다.

+0

그 이유는 클래스 로딩 문제 때문입니다 ... 클래스를 생성하는 코드는 인터페이스와 다른 클래스 로더에로드 될 예외도 생성합니다. 내 지식으로는 인터페이스가 동일한 예외 유형을 사용할 수 없으므로 결코 같을 수는 없습니다. 좀 더 명확 해 졌나요? – Yaneeve

+0

가끔씩 이렇게하는 이유가 있습니다.이 메서드는 구현 관련 확인 예외를 throw 할 수 있다고합니다. 예를 들어, 데이터베이스 나 파일에 기록 할 수있는 지속성 메커니즘을 고려해보십시오. 하나는 SQLException을 던지고 다른 하나는 IOException을 던집니다. 두 경우 모두 응용 프로그램은 쓰기가 실패 할 때 예외를 catch하고 RuntimeException/하위 클래스를 래핑하여 사용자 정의 된 오류 페이지/대화 상자를 만드는 작업에 이르기까지 몇 가지 조치를 취해야합니다. – kdgregory

+0

인터페이스 메서드를 던지고있는 것이 잘못된 이유는 무엇입니까? 구현을 포기해야하는 경우 인터페이스에 문서화되지 않은 상태로 표시되지 않도록 설정하는 것이 좋습니다. 이것은 완전히 틀린 것처럼 보일 것입니다. – user443854

0

보호 방법 중 하나는 공개이고 다른 하나는 기본값이므로 코드가 컴파일되지 않습니다. 공개 또는 기본값으로 설정하십시오.

관련 문제