오류 : 오작동을 하거나 비정상적으로 종료되는 것

  • 문법적 오류 : 문법이 올바르지 않은 상태
  • 실행 오류 
    • 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();
 }

 

+ Recent posts