2014-04-09 4 views
4

예를 들어, "divide"라는 메서드가 있고 그것을 int로 나누고 int를 반환하면 제수가 있는지 확인하는 가장 좋은 방법은 무엇입니까? = 0메서드를 실행하기 전에 가장 좋은 방법은

방법 1 :

private int divide(int i1, int i2) { 
     if(i2 == 0) return 0; 

     return i1/i2; 
} 

방법 2 :

private int divide(int i1, int i2) { 
     if(i2 != 0) { 
      return i1/i2;  
     } else { 
      return 0; 
     } 
    } 

하나는 당신이 선호하는 것?

EDIT : 제수가 0 인 경우 예외가 발생하므로 일반적으로 이러한 함수를 작성하지 않을 것입니다. 이것은 단지 내 질문을 정리하는 것입니다.

편집 2 : 난 그냥 제수 인 경우, 0을 반환하는 방법 기능을 변경 0

+1

항상 구문 분석 노드가 적은 노드를 선호합니다. 'return' 또는'throw' 후의'else'는 항상 중복됩니다. –

답변

1

, 당신은 아무것도 할 필요가 없습니다.

private int divide(int i1, int i2) { 
    return i1/i2; // This will throw an ArithmeticException 
} 

위의 코드함으로써 명시 적으로 RuntimeException을 던지는 작업을 감소 RuntimeException에서 확장하는 ArithmeticException 발생합니다.

편집 : 질문에있는 코드 스 니펫은 샘플 이었으므로 다음은 업데이트 된 답변입니다.

else이 다른 분기 블록이기 때문에이 경우와 같이 불필요한 else을 피하는 것이 더 깔끔하고 우수합니다. 실제로 return보다 많은 부분을 수행하지 않으면 코드가 더 좋습니다. 그것없이.

는 그것이하여 쓸모 else를 떠나, 반환하고 그렇지 않은 경우 당신이 할 필요가 다시 방법에서 return 한, 다음 단지 return 충분의 if로 전환합니다.

private int divide(int i1, int i2) { 
    if(i2 == 0) { 
     return 0; 
    } 
    return i1/i2; 
} 
+1

내 질문이 무엇인지 명확히하는 것은 단지 예일뿐입니다. –

+0

@TimoV - 솔직히 그런 예를 쓰면 안됩니다. 현재 문제가있는 가장 좋은 해결책은 위에 게시 한 것이므로 체크되지 않은 예외가 아닌 체크 된 예외를 던지기 위해 질문을 변경하는 것이 좋습니다. – SudoRahul

+0

@TimoV - 질문을 편집 한 후 답변을 업데이트했습니다. – SudoRahul

1

그것은 더 일반적이며 체크하는 것처럼 (I 더 널리 믿고는) 첫 번째 방법을 사용하는 하나 또는 두 개의 변수 이상이면 매우 긴 줄 들여 쓰기를 시작합니다. 첫 번째 방법은 두 번째 방법과 비교하여 더 간결합니다.

1

내가 읽을 수 있고 앞으로 귀하의 요구 사항이 변경되면 i2 == o처럼 쉽게 유지할 수 있기 때문에 두 번째를 선호합니다. 당신의 목표는 두 번째 인수가 0 때마다 RuntimeException가 발생하는 경우

0
private int divide(int i1, int i2) throws IllegalArgumentException{ 
    if(i2==0) 
    throw new IllegalArgumentException("Argument 'divisor' is 0"); 
    else return i1/i2; 
} 
0

만약 내가 정말로해야한다면, 많은 arguements를 검사한다면 엄청난 양의 들여 쓰기 때문에 첫 번째 방법을 사용할 것입니다.

그럼에도 불구하고 다음과 같이 말합니다. 이러한 검사가 필요한 경우 항상 두 번 평가하십시오.

특별한 경우 0으로 나누면 ArithmeticException이 나오고 이는 / by zero입니다.

this question을 참조하십시오. 특히 null/not null 검사를 사용하는 경우 수표를 사용하여 과장하는 경우가 있습니다.

0

아래의 방법을 사용하십시오. 0을 확인하지 않아도됩니다. 그냥 산술 예외를 던져.

private int divide(int i1, int i2) throws ArithmeticException 
{ 
    return i1/i2; 
} 
1

는 산 제이 Rajjadi 말했듯이 더 읽기 때문에 내가 두 번째 방법을 선호,

private int divide(int i1, int i2) { 
    if(i2 != 0) { 
     return i1/i2; 
    } else { 
     throw new RuntimeException(); 
    } 
} 

을하지만 왜 예외를 던지는? 사용자에게 새로운 int를 삽입하라는 경고 또는 메시지를 표시 할 수 있습니다.

1

개인적으로 나는 RuntimeException을 던지는 것이 좋은 습관이 아니기 때문에 개인적으로 선호하지 않습니다. Exception의 독자적인 서브 클래스를 작성해야합니다. 게다가, 결과 예외 (java.lang.ArithmeticException)가 RuntimeException의 하위 클래스이므로 명시 적으로이 예외를 throw해야하는 이유를 알 수 없습니다.
어쩌면 이런 식으로 시도해야합니까?

private int divide(int i1, int i2) throws DivisionByZeroException { 
    try { 
     return i1/i2; 
    } catch(ArithmeticException e) { 
     throw new DivisionByZeroException(e); 
    } 
관련 문제