기본 예외란 무엇입니까?
Java API에서 제공하는 예외를 나타냅니다.
대표 IllegalArgumentException, IllegalStateException 등
표준 예외는 가독성과 유용성을 높입니다.
이는 다른 프로그래머들이 이미 잘 알고 있는 규칙을 따르기 때문입니다.
표준 예외를 사용하면 직접 구현하는 예외 클래스의 수가 줄어듭니다.
이렇게 하면 메모리 사용량이 줄어들고 클래스를 메모리에 로드하는 데 걸리는 시간이 줄어듭니다.
일반적인 표준 예외
하나. IllegalArgumentException
이 예외는 호출자가 부적절한 값을 인수로 전달할 때 발생합니다.
예를 들어, 승무원의 나이를 입력으로 지정하는 방식에 음수가 지정됩니다.
public void setAge(int age) {
if (age < 0) {
throw new IllegalArgumentException("나이는 음수가 될 수 없습니다.
")
}
this.age = age;
}
2. 불법 상태 예외
이 예외는 대상 개체의 상태가 호출된 메서드를 실행하기에 적합하지 않은 경우 발생할 수 있습니다.
예를 들어, 체스 게임을 하고 있는데 체스판이 생성되지 않은 경우입니다.
public void start() {
if (this.board == null) {
throw new IllegalStateException("보드판이 준비되지 않았습니다.
");
}
}
3. 널포인터 예외
이 예외는 null을 허용하지 않는 메서드에 null을 전달할 때 발생할 수 있습니다.
IllegalArgumentException그러나 관례에 따라 null을 전달하면 NullPointer 예외원인
public void setAge(int age) {
if (age == null) {
throw new NullPointerException("나이는 음수가 될 수 없습니다.
");
}
if (age < 0) {
throw new IllegalArgumentException("나이는 음수가 될 수 없습니다.
");
}
this.age = age;
}
4. ConcurrentModificationException
이 예외는 다중 스레드 환경에서 단일 스레드 환경에 적합한 작업을 시도할 때 발생합니다.
동시에 변경되는 상황을 확실하게 감지할 수 없기 때문에 ConcurrentModificationException문제의 가능성을 나타내는 역할을 합니다.
다음 코드를 실행하면 ConcurrentModificationException이 일어나는 것을 볼 수 있습니다.
void noneFunctionalStream() {
List<Integer> matched = new ArrayList<>();
List<Integer> elements = new ArrayList<>();
for (int i = 0; i < 100; i++) {
elements.add(i);
}
elements.parallelStream()
.forEach(e -> {
if (e >= 50) {
System.out.println(Thread.currentThread().getId()
+ " " + matched);
matched.add(e);
}
});
System.out.println(matched.size());
}
5번째 UnsupportedOperationException
이 예외는 대상 객체가 클라이언트가 요청한 작업을 지원하지 않을 때 발생합니다.
예를 들어 추가 또는 제거를 허용하지 않는 목록 구현으로 요청을 보낼 때 발생합니다.
List<Crew> crews = List.of(new Crew("gray"), new Crew("echo"));
crews.add(new Crew("hoi");
crews.remove(new Crew("gray");
표준 예외 상위 유형을 사용하지 않는 이유는 무엇입니까?
앞에서 설명한 표준 예외에는 상위 유형 예외가 있습니다.
Exception, RuntimeException, Throwable 및 Error와 같은 상위 유형이 있으며 이러한 상위 유형을 직접 재사용하는 것은 좋지 않습니다.
나쁜 방법으로 하는 것보다 하지 않는 것이 좋습니다.
이들은 서로 다른 유형의 예외를 다루는 클래스이기 때문에 안정적으로 테스트할 수 없습니다.
예를 들어 테스트 코드를 작성할 때 테스트에서 적절한 요구 사항을 충족하는 예외가 발생한다고 가정합니다.
상위 유형 예외가 확인되면 이 시점에서 원하는 특정 예외가 발생했는지 알 수 있는 방법이 없습니다.
따라서 Exception, RuntimeException, Throwable 및 Error와 같은 상위 유형은 추상 클래스로 생각하는 것이 좋습니다.
가장 바람직한 방법은 상황에 맞게 표준 예외를 재사용하고 그 당시 Java API 문서를 참조하여 모든 상황에서 예외가 발생하기에 적합한지 확인하는 것입니다.
맞춤 예외
사용자 정의 예외의 경우 예외 이름 자체가 정보를 전달할 수 있습니다.
NoSuchElementException ~처럼 자동차NotFoundException이 더 명확합니다.
또한 예외 정보를 보다 자세하게 제공할 수 있으며 예외에 필요한 메시지와 전송할 정보 데이터를 한 곳에서 관리할 수 있습니다.
그러나 예외 클래스를 개별적으로 생성하면 사용자 정의 예외가 너무 많아질 수 있습니다.
관련된 디렉토리와 클래스를 관리하는 것도 직업이므로 적절하게 사용하는 것이 좋습니다.
public class CarNotFoundException extends RuntimeException {
public CarNotFoundException(String id) {
super("car with " + id + " is not found.")
}
}