AssertionError 란 무엇입니까? 어떤 경우에 내 코드에서 던져야합니까?
"Effective Java, 2nd edition"책의 항목 2에는 작성자가 객체의 빈 초기화를 금지하려는이 코드 스 니펫이 있습니다.
class Example {
private Example() {
throw new AssertionError();
}
}
던져진 예외의 유형이 여기에서 나를 혼란스럽게합니다.
나는이 경우 이해가 안 AssertionError
가 이런 식으로해야하기 때문에 단지 때문에 더 적합 오류의 부재의 발생 또는.
내가 이해 했듯이이 오류는 assert
문이 실패하면 프레임 워크에서 발생 합니다. 또한 javadoc에서는 방금 작성되었습니다.
[An AssertionError is] 어설 션이 실패했음을 나타 내기 위해 발생합니다.
그러나 나는 여기서 어떤 주장 (진실-거짓 진술)이 위반되는 것을 보지 못했습니다. 물론 "You should not instantiate an item of this class"문은 위반되었지만 이것이 그 뒤에있는 논리라면 우리는 모두 AssertionError
s를 어디에나 던져야 하며, 그것은 분명히 일어나는 일이 아닙니다.
FWIW, 나는 방금 던졌을 것입니다
new IllegalStateException("Must not instantiate an element of this class")
그게 뭔가 잘못 됐나요? 어떤 경우 AssertionError
에 내 코드를 던져야 합니까?
미묘한 의구심이라면 미안하지만 코드에서이 패턴을 많이 사용하고 옳은 일을하고 있는지 확인하고 싶습니다.
물론 "당신은이 클래스의 항목을 인스턴스화해서는 안된다"라는 문을 위반했지만 이것이 그 뒤에있는 논리라면 우리는 모두 모든
AssertionErrors
곳에 던져야 합니다. 그리고 그것은 분명히 일어나는 일이 아닙니다.
이 코드는 사용자 가 인수가없는 생성자를 호출 하지 말아야한다고 말하는 것이 아닙니다 . 이 주장은 프로그래머가 아는 한, 인자가 0 인 생성자를 호출하는 것을 불가능하게 만들었다는 것입니다 (이 경우에는 생성 private
하고 Example
의 코드 내에서 호출하지 않음 ). 따라서 호출이 발생하면 해당 주장이 위반 된 것이므로 AssertionError
적절합니다.
의 의미는 AssertionError
개발자가 불가능하다고 생각한 일이 발생했다는 것입니다.
따라서 AssertionError
가 발생하면 프로그래밍 오류의 분명한 신호입니다.
어설 션 오류는 "논리에 따라 실행해서는 안되는 코드를 작성했습니다. 그러나 발생하면 AssertionError를 발생시킵니다. 그리고 그것을 잡을 수 없습니다."라고 말하면 어설 션 오류가 발생합니다. 이 경우 Assertion 오류가 발생합니다.
new IllegalStateException("Must not instantiate an element of this class")' // Is an Exception not error.
참고 : 어설 션 오류는 java.lang.Error 아래에 있으며 오류는 잡히지 않습니다.
나는 여기서 파티에 정말 늦었지만 대부분의 대답은 AssertionError
특히 사용하기보다는 일반적으로 주장을 사용하는 이유와시기에 관한 것 같습니다 .
assert
와 throw new AssertionError()
매우 유사하고 동일한 개념 목적을 제공하지만, 차이가 있습니다.
throw new AssertionError()
jvm에 대해 어설 션이 활성화되었는지 여부에 관계없이 (즉,-ea
스위치를 통해 ) 예외가 발생합니다 .- 컴파일러는 이것이
throw new AssertionError()
블록을 종료 한다는 것을 알고 있으므로이를 사용assert
하면 그렇지 않은 특정 컴파일러 오류를 피할 수 있습니다 .
예를 들면 :
{
boolean b = true;
final int n;
if ( b ) {
n = 5;
} else {
throw new AssertionError();
}
System.out.println("n = " + n);
}
{
boolean b = true;
final int n;
if ( b ) {
n = 5;
} else {
assert false;
}
System.out.println("n = " + n);
}
위의 첫 번째 블록은 잘 컴파일됩니다. 두 번째 블록은 컴파일되지 않습니다. 컴파일러는 n
코드가 인쇄를 시도 할 때 초기화되었음을 보장 할 수 없기 때문 입니다.
AssertionError 는 assert 문이 실패했음을 나타 내기 위해 프로그래머 또는 API 개발자에 의해 명시 적으로 발생하는 확인되지 않은 예외입니다.
assert(x>10);
산출:
AssertionError
x가 10보다 크지 않으면 AssertionError라는 런타임 예외가 발생합니다.
'IT Share you' 카테고리의 다른 글
부모를 채우기 위해 인라인 블록 요소의 높이 가져 오기 (0) | 2020.12.01 |
---|---|
부동 소수점 변수의 범위가 값에 영향을 줍니까? (0) | 2020.12.01 |
Ruby : 공개 정적 메서드를 만드는 방법은 무엇입니까? (0) | 2020.11.30 |
JavaFX-실제로 브라우저에 배포 할 수 있습니까? (0) | 2020.11.30 |
Mercurial에서 마지막 커밋을 어떻게 "롤백"합니까? (0) | 2020.11.30 |