Java 기본 교육--이상 과 오류 구별 Error and Exception
이상 과 잘못 의 차 이 를 알 고 이상 을 잡 았 을 때 어떻게 해 야 하 는 지 알 고 있다.
by Josh Street
많은 프로그래머 들 은 하나의 오류 와 하나의 이상 이 차이 가 있다 는 것 을 의식 하지 못 한다.문제 가 발생 했 을 때 이런 차 이 는 코드 를 어떻게 조작 하 는 지 에 중요 한 의 미 를 가진다(도구 막대,'소개 오류 와 이상'참조).Mary Campione 이 The Java Tutorial(Java 지침)에서 쓴 것 처럼"하나의 이상 은 프로그램 실행 과정 에서 발생 한 사건 으로 정상 적 인 명령 의 운행 을 중단 합 니 다."American Heritage Dictionary 의 설명 에 따 르 면 오 류 는"받 아들 일 수 있 는 코드 행동 의 한 동작 이나 인 스 턴 스 에서 벗 어 났 다"는 것 이다.
그렇다면 편리(deviation)와 중단(disruption)은 어떤 차이 가 있 을 까?우 리 는 이렇게 설명 할 수 있다.만약 당신 이 한 길에서 운전 을 하고 있다 면 누군가가 당신 을 막 았 을 것 이다.이것 은 바로 중단 이다.만약 차 가 시동 을 걸 지 못 한다 면 그것 은 편리 한 것 이다.
이것 은 자바 와 무슨 관계 가 있 습 니까?매우 큰 관계 가 있다.자바 에 게 재 미 있 는 오류 와 이상 차원 관계 가 있 습 니 다(그림 1 참조).
확실히 try{}catch(Exception e){}의 모든 코드 를 사용 하면 오류 의 절반 만 찾 을 수 있 습 니 다.하지만 Throwable 을 차단 해 야 하 는 지 여 부 는 일단 그것 을 차단 하면 어떻게 처리 하 느 냐 에 달 려 있다.Error 의 부분 집합 에 대한 빠 른 이 해 는 VirtualMachineError,ThreadDeath,LinkageError 등 여러 종류의 이름 을 알 수 있 습 니 다.당신 이 이 잘못 들 을 차단 하려 고 할 때,당신 이 그것들 을 처리 해 야 한다 고 확신 합 니 다.왜냐하면 그것 은 심각 한 문제 이기 때문에 잘못 입 니 다.
그림 1.
하지만 ClassCastException 은 잘못 이 아 닙 니까?확실히 아니다.하나의 ClassCastException 또는 이상 한 것 은 VM(가상 컴퓨터)이 알려 주 는 방식 일 뿐 입 니 다.이러한 방식 을 통 해 VM 은 당신(개발 자)이 이미 실 수 를 저 질 렀 다 는 것 을 알 게 되 었 습 니 다.지금 은 수정 할 기회 가 있 습 니 다.
다른 한편,오 류 는 VM 의 고장 이다.우 리 는 Javadoc 가 Error 에 대한 정 의 를 인용 합 니 다."Error 는 Throwable 의 키 집합 입 니 다.합 리 적 인 응용 프로그램 이 캡 처 할 수 없 는 심각 한 문 제 를 말 합 니 다.""대부분 비정상적인 상황 이다."
그래서 잘못 은 처리 하기 어렵다.일반적인 개발 자(물론 너 는 아니다)는 이런 잘못 을 처리 하 는 미묘 한 점 을 이해 할 수 없다.그렇다면 당신 의 일 에서 잘못 이 라 고 할 수 있 는 사건 이 생 길 것 이 라 고 생각 할 때 어떻게 해 야 합 니까?
우선 잘못 이 이상 하 게 던 져 졌 다 는 것 을 기억 하 는 것 은 조금 다르다.잘못된 방법 을 던 져 서 무엇 을 하고 있 는 지 설명 할 필요 가 없습니다.
public void myFirstMethod() throws Exception
//Since it's an exception, I have to declare
//it in the throws clause {
throw new Exception();
}
public void mySecondMethod()
//Because errors aren't supposed to occur, you
//don't have to declare them.
{
throw new Error();
}
몇 가지 이상 이 unchecked 인 것 을 주의 하 십시오.따라서 그 행 위 는 오류 와 같 습 니 다.NullPointer Exception,ClassCastException 과 Index OutOf Bounds Exception 은 모두 Runtime Exception 의 하위 클래스 이 고 Runtime Exception 과 그 모든 부분 집합 은 보통 unchecked 입 니 다.
그럼 이 싫어 하 는 unchecked 의 이상 을 어떻게 처리 해 야 합 니까?너 는 그것들 이 나타 날 수 있 는 방법 에서 이상 을 포착 할 수 있 지만,이런 방법 은 매우 큰 우연성 을 가지 고 있다.이렇게 하면 문 제 를 해결 할 수 있 지만,다른 unchecked 의 이상 중단 코드 의 다른 부분 을 해결 할 수 있 습 니 다.우 리 는 ThreadGroup 류 가 제공 한 좋 은 방법 에 감사 해 야 한다.
public class ApplicationLoader extends ThreadGroup
{
private ApplicationLoader()
{
super("ApplicationLoader");
}
public static void main(String[] args)
{
Runnable appStarter = new Runnable()
{
public void run()
{
//invoke your application
(i.e. MySystem.main(args)}
}
new Thread(new ApplicationLoader(),
appStarter).start();
}
//We overload this method from our parent
//ThreadGroup , which will make sure that it
//gets called when it needs to be. This is
//where the magic occurs.
public void uncaughtException(Thread thread, Throwable exception)
{
//Handle the error/exception.
//Typical operations might be displaying a
//useful dialog, writing to an event log, etc.
}
이 방법 은 우리 의 프로 그래 밍 에 매우 큰 변 화 를 가 져 왔 다.생각해 보 세 요.과거 에 GUI 에서 동작 을 실 행 했 을 때 unchecked 의 이상 이 발생 하면 GUI 는 정상 적 이지 않 은 상태 에 있 습 니 다.(대화 상자 가 열 려 있 고 버튼 이 활성화 되 지 않 으 며 포인터 가 잘못된 상태 에 있 습 니 다)그러나 이런 방법 을 사용 하면 GUI 를 정상 상태 로 회복 시 켜 사용자 에 게 발생 한 오 류 를 알 릴 수 있 습 니 다.질 좋 은 프로그램 을 만 들 었 기 때문에 기분 이 좋 을 것 입 니 다.
하지만 이런 기술 은 GUI 에 만 쓰 이 는 것 이 아니다.너무 많은 자원 을 사용 한 서버 응용 프로그램 은 이러한 방법 으로 전역 에서 자원 을 방출 할 수 있 으 며,일반적으로 VM 이 불안정 한 상태 에 들 어가 지 않도록 할 수 있다.가능 한 한 빨리 잘못 을 찾아내 고 현명 한 방법 으로 처리 하 는 것 은 위대 한 프로그래머 와 평범한 프로그래머 사이 의 차이 이다.네가 이미 본문 을 읽 었 기 때문에,네가 어떤 프로그래머 가 되 고 싶 은 지 는 분명 하 다.
저자:Josh Street 은 Bank of America 의 구조 사 이 며 주로 전자상거래 솔 루 션 개발 을 맡 고 있 습 니 다.그의 연락 처 는[email protected]。
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.