오류에는 예외와 에러로 나뉜다.
예외는 일반 예외와 실행 예외로 또 나뉜다.
자바에서는 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것을 에러라고 한다.
그리고 에러 이외에 프로그램 자체에서 발생하는 오류는 예외라고 부른다.
예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다.
예외가 발생되면 곧바로 종료된다는 점에서는 에러와 비슷하다.
그러나 예외는 예외 처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.
자바는 예외가 발생할 가능성이 높은 코드를 컴파일할 때 예외 처리 유무를 확인한다.
만약 예외 처리 코드가 없다면 컴파일 되지 않는다. 하지만 모든 예외에 대해서 예외 처리 유무를 확인하는 것은 아니다.
실행 예외와 일반 예외를 구별하는 방법으로 일반 예외는 Runtime exception을 제외한 Exception 클래스를 상속받은 모든 예외 클래스를 말하고 실행 예외는 Runtime exception을 상속받은 다양한 클래스를 말한다.
예외 역시 클래스로 구성
Throwable이라는 클래스가 예외의 최상위 클래스
예외 클래스 : 자바에서는 예외를 클래스로 관리한다. JVM은 프로그램을 실행하는 도중에 예외가 발생하면 해당 예외 클래스로 객체를 생성한다.
그리고 나서 예외 처리 코드에서 예외 객체를 이용할 수 있도록 해준다. 모든 예외 클래스는 java.lang.Exception 클래스를 상속받는다.
일반 예외 : 컴파일러 체크 예외라고도 하는데, 프로그램 실행 시 예외가 발생할 가능성이 높기때문에 자바 소스를 컴파일하는 과정에서 해당 예외 처리 코드가 있는지 검사한다.
만약 예외 처리 코드가 없다면 컴파일 에러가 발생한다.
실행 예외 : 컴파일러 넌 체크 예외라고도 하는데, 실행 시 예측할 수 없이 갑자기 발생하기 때문에 컴파일하는 과정에서 예외 처리 코드가 있는지 검사하지 않는다.
자바 컴파일러는 소스 파일을 컴파일할 때 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 에러를 발생시켜 개발자가 강제적으로 예외 처리 코드를 작성하도록 요구한다.
그러나 실행 예외는 컴파일러가 체크해주지 않기 때문에 개발자의 경험을 바탕을 ㅗ예외 처리 코드를 작성해야 한다.
예외 처리 : 프로그램에서 예외가 발생했을 경우 프로그램의 갑작스러운 종료를 막고, 정상 실행을 유지할 수 있도록 처리하는것을 말한다.
try-catch-finally 블록 : 생성자 내부와 메소드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해준다.
다중 catch 블록 : catch 블록이 여러 개라 할지라도 단 하나의 catch 블록만 실행된다. 그 이유는 try 블록에서 동시다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문이다.
*다중 catch 블록을 작성할 때 주의할 점은 상위 예외 클래스가 하위 예외 클래스보다 아래쪽에 위치해야 한다는 것이다.
try 블록에서 예외가 발생했을 때, 예외를 처리해줄 catch 블록은 위에서부터 차례대로 검색된다.
만약 상위 예외 클래스의 catch 블록이 위에 있다면 하위 클래스의 catch 블록은 실행되지 않는다.
왜냐하면 하위 예외는 상위 예외를 상속했기 때문에 상위 예외 타입도 되기 때문이다.
예외 떠넘기기
메소드 내부에서 예외가 발생할 수 있는 코드를 작성할 때 try-catch 블록으로 예외를 처리하는 것이 기본이지만,
경우에 따라서는 메소드를 호출한 곳으로 예외를 떠넘길수도 있다. 이때 사용하는 키워드가 throws이다.
throws 키워드 : 메소드 선언부 끝에 작성되어 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할을 한다. throws 키워드 뒤에는 떠넘길 예외 클래스를 쉼표로 구분해서 나열해주면 된다.
'Java > information' 카테고리의 다른 글
[자바/JAVA] java.util의 여러 클래스들 (0) | 2023.05.23 |
---|---|
[자바/JAVA] API와 String 메소드들 (0) | 2023.05.19 |
[자바/JAVA] 익명 객체 (0) | 2023.05.15 |
[자바/JAVA] 중첩클래스 (0) | 2023.05.11 |
[자바/JAVA] interface (0) | 2023.05.09 |