2014-09-24 3 views
0

다음 시나리오를 그림. 나는 두 세트의 클래스와 인터페이스를 가지고있다. ClassA, ClassB, ClassAInterfaceClassBInterface. ClassA은 여러 가지 방법으로 ClassB을 사용합니다. ClassB의 이러한 메서드는 간혹 예외를 throw합니다. 인터페이스 및 Java 클래스의 예외 처리

public class ClassA implements ClassAInterface { 
    public void example() { 
     ClassB test = new ClassB(); 
     ClassB.exampleTest(); 

     //more code using ClassB 
    } 
} 

public class ClassB implements ClassBInterface { 
    public void exampleTest() throws ExampleException() { 
     boolean tru = false; 
     if (tru) { 
     throw new ExampleException(); 
     } 
    } 
} 

그래서 제가하는 데 문제는 내가 ClassA.example() 방법에 Unhandled Exception type ExampleException() 오류를 얻고 있다는 것입니다. 왜 이런 일이 생길까요? ClassB 메서드가 특정 경우에 예외를 throw하고 때때로 throws ExampleException()과 함께 예외를 throw하므로 ClassA가 컴파일되지 않습니다. 이를 해결하기 위해 ClassAInterface을 위반할 것이므로 ClassA.example()에 throws 문을 추가 할 수 없습니다. 그리고 만약 내가 단지 ClassB.exampleTest()을 try catch 문으로 감싸면 ClassB이 잘못된 것을 의미하고 예외를 throw하는 전체 지점 인 예외 지점을 던져야하기 때문에 ClassA.example()의 많은 부분이 오류를 던질 것입니다. 그래서 나는 왜 이것이 일어나고 있는지, 어떻게 해결할 지 확신하지 못한다.

+0

아마도, ClassA가 예외를 throw하지 못하도록하는 귀하의 결정은 잘못되었습니다. 그러나 확실한 경우에는 RuntimeException에서 ClassB의 예외를 래핑하거나 (확인되지 ​​않음) 클래스 B에서 예외를 catch하고 로깅 할 수 있습니다. – markspace

+0

"확인 된"예외에 대한 규칙이 Java의 규칙이기 때문에 발생합니다. 누군가를 비난하고 싶다면 John Goodenough를 비난하십시오. 그는 그 당시에 그들에 대해 많이 알지 못했지만 "예외적 인"기사를 썼다. 그리고 그 이후로 우리는 그의 계획에 매달렸다. –

답변

2

왜 코드가 컴파일을 거부합니까?

아주 정상입니다. 당신이 말했듯이, B.exampleTest() 때때로 예외를 throw합니다. A.example()B.exampleTest()으로 전화를 걸고 예외를 포착하지 않습니다. 따라서 예외가 항상 발생하지는 않더라도 때때로 발생합니다. 그리고 예외가 발생하면 A.example()에 의해 throw됩니다. 따라서 그것은 선언되거나 포착되어야합니다. B.exampleTest()처럼 때때로 예외를 던지기 때문에 A.example()도 때때로 같은 예외를 throw합니다.

이제 무엇을해야합니까?

  1. 는 예외가 발생 함을 선언 : A.example()의 호출자는이 경우에 무엇을 결정해야 할 것이다 당신은 3 개 선택 사항이 있습니다.
  2. A.example() 안에 붙잡고 어떻게 든 처리합니다.
  3. catch하고 런타임 예외 (throws 절에서 선언 할 필요가없는) 내에 래핑 한 다음이 런타임 예외를 throw합니다. 호출자는이 런타임 예외를 처리해야하지만 예외가 발생할 수 있다는 컴파일러의 힌트는 없습니다.