본문 바로가기
Java/study

예외 처리

by avvin 2019. 4. 11.


 

Exception(일반예외) 


:이클립스에서는 컴파일 전에 빨간줄로 예외가 발생했음을 알려주고 오류를 안내해준다.


RuntimeException(실행예외) 


:예외처리를 해주지 않으면 컴파일 중 프로그램을 종료시키고 어떤 예외가 발생했는지 콘솔창에 띄워준다.




RuntimeException(실행예외)

  • NullPointException

:참조변수에 값을 주지 않아(기본값 null값을 가질때) 객체가 없을 때 발생


  • ArrayIndexOutOfBoundsException
:배열에서 인덱스 범위 초과해서 사용할 경우

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package testException;
 
public class RuntimeExceptionRest1 {
 
//    ArrayIndexOutOfBoundsException 해결하려면 배열 길이 먼저 조사하고 조건문을 통해 예외와 예외 해결 방법을 알려준다.
    
    public static void main (String[] args) {
 
        if(args.length==2) {
            String data1 = args[0];
            String data2 = args[1];
        }
        else {
            System.out.println("[실행방법]");
            System.out.println("ArrayIndexOutOfBoundsException 값1, 값2");
        }
    }
}
 
cs



  • NumberFormatException

Integer.parseInt(String s)

Double.parseDouble(String s)


정적 메소드 parse(String s)는 숫자로 변환될 수 있는 문자열은 숫자로 리턴하고, 변환될 수 없는 문자열을 매개값으로 받을 시 예외를 발생시킨다.


  • ClassCastException


상속관계와 구현관계에서의 타입캐스팅은 

자식(구현)1 객체 -> 부모(인터페이스)타입 변수와같이 promotion을 행한 뒤 다시 해당 자식(구현)1 객체로 타입변환할 때에만 가능한데

다른타입으로 캐스팅하려할때 발생한다.


이러한 실수를 방지하기 위해 instanceof 연산을 이용

[객체 instanceof 변환할 타입] 좌항 객체가 우항타입으로 변환이 가능하면 true를 반환하는 논리연산자



그래서 타입 캐스팅할땐 캐스팅하는 코드 실행문을 if(객체 instanceof 변환할타입)문 블럭 안에 위치시키는 것이 좋다. 검사 후엔 주석처리



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package testException;
 
public class RuntimeExceptionRest1 {
 
//    ClassCastException은 타입변환 가능한지 검사만 제대로하면 발생할 일이 없다.
    
    public static void main (String[] args) {
        
        Parent parent = new Child();
    
        //타입캐스팅할때 가능한지 여부 검사
        if(parent instanceof Child == true) {    
            
            Child child1 = (Child) parent; 
            System.out.println("1. 타입 변환 성공");
    
        }else {
            
            System.out.println("1. ClassCastException");
            
        }
        
        Parent parent2 = new Child();
        
        //타입캐스팅할때 가능한지 여부 검사
        if(parent2 instanceof AnotherChild == true) {    
            
            AnotherChild child2 = (AnotherChild)parent2;        
            System.out.println("2. 타입 변환 성공");
            
        } else {
            
            System.out.println("2. ClassCastException");
            
        }
    }
}
 
cs


실행 결과: 


1. 타입 변환 성공

2. ClassCastException





예외 처리


예외처리는 try-catch-finally 이용



  • 다중 catch

try블록 내부에 다양한 종류의 예외가 발생할 수 있으므로

발생되는 예외 별로 catch 블록을 다중으로 작성할 수 있다.

try 블록은 하나의 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하기 때문에 다중으로 작성된 catch블록 중 단 하나의 블록만 실행된다.

이 때, 상위예외클래스 보다 하위예외클래스를 위쪽에 위치시켜야한다. 

상위예외클래스가 위에 위치하면 어떠한 경우에도 하위예외클래스가 실행될 수 없다.



  • 자동 리소스닫기

AutoCloseable 인터페이스를 구현(implements)하는 리소스 클래스는

자바7에서 추가된 try-with-resources [ try(리소스 객체 생성 코드) { ... } ]를 사용하면 

try 실행문이 정상 실행되거나 예외가 발생할 시 close메서드를 자동으로 호출한다. 

AutoCloseable 인터페이스에 close() 메소드가 정의되어있는데 try(리소스 객체 생성 코드) { ... }는 이 close() 메소드를 자동 호출한다.



  • 예외 떠넘기기★

예외가 발생하는 실행문을 포함하는 메소드1 선언부 뒤에 throws 예외클래스1, 2, 3 ..을 작성하면 메서드가 호출된 곳에서 예외처리를 해야한다. 

(호출된 메서드1(); 가 try문 안에 들어간다. 넘겨받은 메소드2에서도 메소드2를 호출한 곳으로 예외를 떠넘길 수 있다.)



  • 사용자 정의 예외 (=Application Exception)


사용자 정의 예외 클래스 이름은 XXXException으로 하는게 관례

일반예외로 선언할 경우  Exception, 실행예외로 선언할 경우 RuntimeException을 extends

대부분 생성자만을 포함하며 기본생성자, 예외처리메시지를 전달하기위한 String 매개변수를 갖는 생성자, 이렇게 두개의 생성자를 갖는 것이 일반적

String 매개변수를 갖는 생성자는 상위 클래스의 생성자를 호출하여 예외 메시지를 넘겨준다.// super(message); : 부모객체에 예외메시지 전달




  • 사용자 정의 예외 발생시키기


( 선언부 뒤에 throws 키워드 포함하는 메소드 = 예외가 발생할 수 있는 메소드 ) 

EX)조건이 충족되면 예외를 발생시키도록 메서드 내의 if문에서 예외 발생시키기 


throw new 사용자정의예외클래스타입( "message" );




  • 예외 정보 얻기(예외 이름 / 예외 발생 위치)


모든 예외 객체는 Exception을 상속받기때문에 Exception의 메소드를 호출할 수 있다.


getMessage() 는 String 타입으로 "예외 이름"을 리턴

printStackTrace() 콘솔창에 예외 발생 위치를 알려줌



catch(Exception e){


String message = e.getMessage();


e.printStackTrace();

}








(예제 코드 추가하기)



'Java > study' 카테고리의 다른 글

멀티스레드  (0) 2019.04.16
Java 자주쓰는 단축키 모음  (0) 2019.04.15
Calendar class의 객체는 싱글톤일까?  (0) 2019.04.10
static  (0) 2019.04.10
추상 클래스 / 추상 메서드  (0) 2019.04.09