문제
다음 코드가 있다고 가정 해 봅시다.
public class MainClass {
public static void main(String[] args) {
System.out.println(sumNumbers(10, 10));
}
//@requires a >= 10;
//@ensures \result < 0;
public static int sumNumbers(int a, int b) {
return a+b;
}
}
여기서 두 가지를 만들 수 있습니다.
코드 계약을 사용합니다 (이 경우 주석에있는 것은). Sumnumbers가 실행되고 <10이되면 즉시 예외가 발생합니다 (매우 설명적인 것은 아니지만).
Exception in thread "main" org.jmlspecs.jmlrac.runtime.JMLInternalNormalPostconditionError: by method MainClass.sumNumbers
at MainClass.sumNumbers(MainClass.java:500)
at MainClass.internal$main(MainClass.java:9)
at MainClass.main(MainClass.java:286)
또는...
예외를 던져. 예외는 내가 원하는만큼 설명 할 수 있습니다. 또한 게시물 조건이 사실인지 아닌지 볼 때마다 기능의 끝을 확인해야합니다.
여기서 어느 것을 사용하고 그 이유는 무엇입니까?
해결책
나는 코드 계약의 아이디어가 마음에 들지만 설명 적 IllegalArgumentException
(또는 이와 유사한) 나를 위해 팁을줍니다. 명시 적 예외 메시지를 얻는 것이 지원/생산 역할 (또는 개발)이 훨씬 명확합니다. 이는 진단의 헤드 스타트를 제공합니다. ).
다른 팁
프로그램의 정상 작동 중에 유효하지 않은 입력 이이 인수로 전달 될 것으로 기대하십니까? 그들이 있다면, 당신은 그것으로부터 회복 할 수 있습니까?
그렇다면 확인 된 예외는 갈 길입니다.
이런 종류의 사례에서 회복 할 수 없다면, 항상 계약을 맺고 큰 소리로 실패하지만 어느 경우에도 설명 오류 메시지를 사용합니다.
제휴하지 않습니다 StackOverflow