2011-11-04 4 views
0

포인트 및 벡터에 대한 클래스를 쓰고 있습니다. 벡터의 점 및 표준을 계산할 때이 클래스를 사용하고 싶습니다. 이들은자바에서 절대 발생하지 않는 예외

public class Point { 
    public float x,y; 
} 
public class MyVector { 
     public Point start,end; 
} 

나는 점 계산이 코드 점을 작성 포인트 및 벡터 클래스입니다.

public float dot(MyVector v) throws Exception 
{ 
    if((start.x != v.start.x) || (start.y != v.start.y)) 
     throw new Exception("Vectors not begin in same Point"); 
} 

나는 벡터의 표준을 계산하기 위해이 기능을 사용하고 싶습니다.

public float norm() 
{ 
     return dot(this); 
} 

정상적인 기능에서는 예외 조건이 발생하지 않는다는 것을 알고 있습니다. 그래서 나는 예외를 던지지 않을 것이다. 나는이 같은 우는 소리 할 수 ​​있다는 사실을 알고 :

public float norm() 
{ 
    try 
    { 
     return dot(this); 
    } 
    catch(Exception e) 
    { 

    } 
} 

을하지만이 중복 생각합니다. try와 catch 함수를 제거하는 방법이 있습니까?

+4

대신 RuntimeException을 확장하는 무언가를 던져보십시오 - 검사되지 않은 예외를 시도하거나 잡을 필요가 없습니다. (http://download.oracle.com/javase/tutorial/essential/exceptions/runtime.html 참조) – BobG

답변

4

이 의도는 java로 표현할 수 없습니다. 함수 도트가 예외를 throw하는지 여부를 지정합니다.

예외가 발생하지 않는 조건이 있음을 지정하는 "힌트"를 지정할 수 없습니다.

그 상황에서 살거나 RuntimeException 만 사용하도록 전환 할 수 있습니다.

또는 당신은 unchecked_dot 실제 작업을 수행하지만 인수를 확인하지 않고 예외를 던져 선언하지 않는이

public float dot(MyVector v) throws Exception 
{ 
    if((start.x != v.start.x) || (start.y != v.start.y)) 
     throw new Exception("Vectors not begin in same Point"); 

    return unchecked_dot(MyVector v) 
} 

처럼 뭔가를 리팩토링 할 수있다. 당신이 그 점 (...)이 예외를 발생한다고 생각하는 이유가있는 경우

public float norm() 
{ 
    return uncheked_dot(this); 
} 
2

자바 언어는 사용할 수 없습니다.

이 문제를 해결하는 가장 좋은 방법은 의견 및 다시 게시하는 것입니다. 당신이 Appendable 소요 write 방법을 사용하지만 통과하는 경우

는 예를 들어, StringBuilder는 어쩌면 당신은 Appendable.append 실제로이 작업을 수행하지 결코 IOExceptionStringBuilder 때문에 발생한다는 사실을 얼버무 싶다. 당신이 다음 AssertionError에 rethrowing으로 던져 대리인 기능의 능력에 대해 (현재 또는 미래에) 잘못이 있다면, 당신은 코드 관리자들에게 무엇이 잘못되었는지에 대한 자세한 정보를 제공하는 것이

try { 
    write(myStringBuilder); 
    } catch (IOException ex) { 
    // Should never happen since StringBuilders do 
    // not throw IOexceptions on append. 
    throw new AssertionError(ex); 
    } 

참고.

프로젝트에서 로깅 시스템을 일관성있게 사용하는 경우 예외 로깅 및 삭제가 모든 불변량을 위반하지 않는 경우 로깅은 훌륭한 옵션 일 수 있습니다.

1

도 (...) 규범해야 할 수있다. 예외를 먹는 것은별로 좋은 생각이 아닙니다. 하지만 네가 원한다면, try catch를 써야합니다. 유일한 다른 옵션은 도트 (...)에서 RuntimeException을 던질 수있는 경우에 잡을 필요가없는 경우입니다.

+0

사실,이 상황에서 dot()은 잘못된 인수 예외와 같은 것을 던질 것입니다. 그러나, 어떤 인수를하지 않는 norm()에서는 그렇지 않습니다. – Krab

+0

@Krab, 그건 아주 유효한 지적입니다! – aishwarya

1

일반적인 예외는 throw하지 마십시오.

RuntimeException의 하위 클래스를 만들고 - 예를 들어 업스트림에 쉽게 붙잡을 수 있도록 -. "DotUndefinedException".

런타임 예외로 처리 할 때 명시 적으로 처리하지 않으면 지정하지 않아도됩니다.

관련 문제