오류 : 오작동을 하거나 비정상적으로 종료되는 것
- 문법적 오류 : 문법이 올바르지 않은 상태
- 실행 오류
- 1.오류(에러) : 시스템이 정상적인 기능을 수행할 수 없게 된 상태(수습불가)
- 2.예외: 실행 중 예기치 않은 문제가 발생한 상태(수습 가능)
- 논리적 오류 : 개발자가 원하는 결과가 산출되지 않는 상태
예외 : 사용자의 잘못된 조작 또는 부정확한 데이터 처리 또는 개발자의 잘못된 코딩으로 인한 오류. 자바에서 예외도 하나의 객체
예외 처리 : 미리 코드를 작성해서 대처하는 과정
예외 객체: 오류를 설명하는 객체를 생성하게 되는데 그 객체. 오류정보, 오류의 타입과 오류 발생 시의 프로그램의 상태 등의 정보를 포함. 생성하는 것을 예외를 던진다(throw) 처리하는 것 예외를 잡는다(catch)
#예외 처리 코드: 예외 발생 시 프로그램 종료 막고. 정상 실행 유지할 수 있도록 처리
[try{
//예외가 발생할 수 있는 코드
} catch(예외종류 참조변수){
//예외를 처리하는 코드
} finally {
//해당 코드는 try 블록이 끝나면 무조건 실행된다.
}]
try와 catch 블록은 별도의 독립된 블록(try블록에서 정의된 변수는 catch블록에서 사용할 수 없다.)
finally문은 try블록에서 사용했던 자원을 해제하기 위해서 사용.
#printStackTrace() : 예외 발생 코드 추적한 내용을 모두 콘솔에 출력
모든 예외 객체는 Trowable를 상속받는다. Trowable에 선언된 메서드 중 예외 처리에 자주 사용되는 메서드는 다음과 같다.
제어자 및 타입 | 메서드 | 설명 |
String | getMessage() | 발생한 예외 객체의 메시지를 추출 |
void | printStackTrace() | 예외가 발생하기까지 호출된 순서를 거꾸로 출력 |
String | toString() | 발생한 예외 객체를 문자열로 추출 |
분류 | 예외 | 설명 |
RuntimeException | ArithmeticException | 어떤 수를 0으로 나눌 때 발생한다. |
RuntimeException | NullPointerException | null 객체를 참조할 때 발생한다. |
RuntimeException | ClassCastException | 적절치 못한 클래스로 형변환하는 경우에 발생한다. |
RuntimeException | NegativeArraySizeException | 배열의 크기가 음수값인 경우 발생한다. |
RuntimeException | ArrayIndexOutOfBoundsException | 배열을 참조하는 인덱스가 잘못된 경우 발생한다. |
IOException | IOException | 파일의 끝을 지나쳐서 읽으려고 하는경우나 잘못된 URL을 사용하는 경우에 발생한다. |
#NullPointerException : 객체 참조가 없는 상태
String data = null;
System.out.println(data.length());
#ArrayIndexOutOfBoundsException : 배열에서 인덱스 범위 초과하여 사용할 경우 발생
int[] arr = new arr[5];
arr[5]=100;
#ClassCastException : 타입 변환이 되지 않을 경우 발생
Animal animal = new Dog();
Cat cat = (Cat) animal;
Exception 계열 예외는 확인된 예외, 미확인 예외로 분류. 확인된 예외에 대한 에외 처리를 구현하지 않으면 컴파일 시 오류가 발생한다. 확인된 예외는 소스파일이 컴파일될 때 컬파일러가 예외 처리를 했는지 검사하기 때문이다.
예외를 처리할 때 상위 클래스를 이용하면 하위 클래스까지 포괄적으로 처리할 수 있다.
다중 catch : 예외 별로 예외 처리 코드 다르게 구현
멀티 catch : 하나의 catch 블록에서 여러 개의 예외 처리 가능. 동일하게 처리하고 싶은 예외를 |로 연결.
try-with-resourses
- 예외 발생여부와 상관 없음.
- 문장의 끝에서 리소스들이 자동으로 닫혀지게 한다. 사용했던 리소스 객체의 close() 메소드 호출해 리소스 닫는다.
[try(리소스자료형1 참조변수 = new 리소스자료형1();
리소스자료형2 참조변수 = new 리소스자료형2()){
...
}catch(예외타입 변수){
...
}]
메소드 내부에서 처리하지 않고 메소드를 호출할 때 에러를 처리하도록 만드는 기법 : throws(에러 처리츷 미룰 때 사용하는 키워드)를 사용하여, 다른 메서드한테 예외 처리를 맡긴다.
int method(int n) throws IOException{
...
}
#throws : 메서드 선언부 끝에 작성
[리턴타입 메서드명(매개변수) throws 예외클래스1, 예외클래스2{
...
}]
- 예외처리를 자신이 담당하지 않고 자신을 호출한 쪽으로 던져버리는 방법
- 메서드 내에서 예외가 발생하면 예외를 자신을 호출한 상위 메서드로 예외를 전달할 수 있다.
- throws가 선언된 메서드는 메서드를 호출한 곳에서 throws 다음에 선언된 예외들을 처리하도록 위임한다.
- throws는 메서드를 호출하는 곳의 상황에 맞게 동적인 오류 처리를 하기 위해 사용하는 명령문
- 메서드에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 역할
#사용자 정의 예외 클래스 선언 : Exception클래스를 상속 받아야한다.
[class 예외클래스명 extends [Exception | RuntimeException]{
public 예외클래스명(){ }
public 예외클래스명(String message){
super(message);
}
}]
- 사용자 정의 예외 객체는 프로그램 내에서 예외 상황과 예외 객체 생성을 처리해주어야한다.
- 예외 상황은 조건문으로 처리하고 예외 객체 생성은 throw 문으로 할 수 있다.
throw : 예외 객체를 생성해서 강제로 던질 수 있는 예약어, 프로그래머가 의도적으로 예외를 발생시키고자 할 때 사용하는 예약어로 사용자 정의 예외를 만든 후 예외를 사용자가 발생시킬 때 주로 사용
[throw new 예외클래스명();
throw new 예외클래스명("출력 메시지");]
[public void method() throws 예외클래스명{
throw new 예외클래스명();
}]
#getMessage() : 예외 발생시킬 때 생성자 매개값으로 사용한 메시지 리턴
[throw new 예외클래스명("출력 메시지");]
}catch(Exception e){
String message = e.getMessage();
}