티스토리 뷰

[java29강] try catch finally (예외처리)



이번 강의에서는 자바 try catch finally 에 대해서 알아보겠습니다.

우선 exception 에 대해서 알아야합니다.

28강의 exception 강의를 먼저 보시고 오시길 추천합니다 ㅎㅎ


([java28강] 예외(Exception) 종류 및 발생원인 --> http://bvc12.tistory.com/193)


try catch finally 는 RuntimeException 의 발생을 막아주기 위해 사용합니다.

실행도중에 오류가나온다면... RuntimeException 의 종류가 80% 는 됩니다.

그럼 RuntimeException 이 발생하면 수정해주는 코드를 작성해주면 되겠죠 ㅎㅎ

그것이 바로 try catch finally 입니다.


try catch finally의 문법은...

1
2
3
4
5
6
7
8
try {
    //오류가 발생할수있는 코드            
} catch (예외코드 예외코드명) {
    //오류가 발생하면 실행시킬 코드
} finally {
    //catch 문구까지 끝나고 무조건 한번 실행시킬 코드
    //finally 구문은 필수요소가 아니므로 사용하지 않아도 됨
}

이렇게 됩니다.

try 구문에 오류가 발생할수 있는 코드를 넣고...

catch 부문에 예외가 발생할 코드를 넣어주고.. 구문에는 오류발생시 실행시킬 코드를 넣어줍니다.

그다음 사용해두되고 사용안해도 되는 finally 구문에 무조건 실행시킬 코드를 넣어줍니다.


그럼 예제로 바로들어가기전 가장 잘 일어날수 있는 RuntimeException 이 무엇이 있을까요...?

바로 형변환 입니다.

숫자로 사용해야하는 메소드가 있는대 문자가 들어가면 어떻게 될까요?

바로 오류가 납니다. RuntimeException  의 종류중 하나가 나오겠죠 ㅎㅎ

이런 예제로 바로 살펴보도록 하겠습니다.


RuntimeException 발생할 예제

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
package test29;
 
import java.util.Scanner;
 
public class test29 {
 
    public static void main(String[] args) {
        
        IntTypeClass intTypeClass = new IntTypeClass();
        
        Scanner scanner = new Scanner(System.in);
        intTypeClass.multiply(scanner.nextInt());
        
        
    }
    
 
}
 
class IntTypeClass {
    
    public void multiply(int a) {
        System.out.println("입력하신 " + a + " 의 2제곱은 " + a * a + " 입니다.");
    }
    
}
 


설명


밑에 2의 제곱을 구하는 IntTypeClass 클래스와 multiply 메소드를 만들어 주었습니다.

public void multiply(int a) {
        System.out.println("입력하신 " + a + " 의 2제곱은 " + a * a + " 입니다.");
    }

multiply 메소드에서는 int type 의 값을 받아 곱한후 출력해주는 메소드입니다.

test29 클래스의 main 에서는 밑에 만들어놓은 IntTypeClass 클래스를 생성해 주고  

Scanner scanner = new Scanner(System.in);

scanner 를 생성하였습니다. (콘솔창에서 값을 받기위해 생성)

intTypeClass.multiply(scanner.nextInt());

위애서 생성해놓은 intTypeClass 의 메소드 multiply 에 콘솔에서 입력 받은 값을 바로 int type 으로 값을 넘겨 메소드를 실행하였습니다.




결과


숫자를 입력하니 잘처리 하는군요 ㅎㅎ

하지만... 문자를 입력하면 어떻게 될까요?

잉??? inputMismatchException 이라고 오류가 나왔습니다....

inputMismatchException 은 RuntimeException 의 종류로 타입이 안맞으면 발생합니다...

이런식으로 오류가 발생할수도... 발생을 안할수도 있습니다...

그럼 RuntimeException 이 발생하지 않도록 try catch 를 사용한 예제를 보도록 하죠.



try catch 적용 예제

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
39
40
41
42
43
44
45
package test29;
 
import java.util.InputMismatchException;
import java.util.Scanner;
 
public class test29 {
 
    
    
    public static void main(String[] args) {
        
        IntTypeClass intTypeClass = new IntTypeClass();
        TestScanner testScanner = new TestScanner();
        intTypeClass.multiply(testScanner.input());
        
    }
 
}
 
class IntTypeClass {
    
    public void multiply(int a) {
        System.out.println("입력하신 " + a + " 의 2제곱은 " + a * a + " 입니다.");
    }
    
}
 
class TestScanner {
    Scanner scanner = new Scanner(System.in);
    int a = 0;
    
    public int input() {
        
        try {
            a = scanner.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("숫자로 다시 입력해주세요.");
            scanner.next();
            input();
        }
        
        return a;
    }
}

이번에는 입력받는것을 정리하여 TestScanner 라는 클레스를 추가하였습니다.

class TestScanner {
    Scanner scanner = new Scanner(System.in);
    int a = 0;
    
    public int input() {
        
        try {
            a = scanner.nextInt();
        } catch (InputMismatchException e) {
            System.out.println("숫자로 다시 입력해주세요.");
            scanner.next();
            input();
        }
        
        return a;
    }
}

input() 이라는 메소드를 만들어 try catch 를 씌워 주웠습니다.

try 구문을 보시면 int a 에 입력받은 값을 넣어 주었습니다.

만약 입력받은 값이 문자라면 catch 구문으로 넘어가 

System.out.println("숫자로 다시 입력해주세요.");

출력하고 scanner.next(); 를 통해 다음 입력을 받을수 있습니다.

그리고 다시 input() 메소드를 실행합니다.

그다음 모든 입력이 끝나면 a의 값을 리턴해줍니다.


실행결과

문자를 입력하면 다시입력하라고 문구가 나오고...

숫자를 입력하면 입력한 값의 2제곱값이 나옵니다.


여기서 의문점이 생기는 사람들도 있을것입니다..

왜 입력 받는것을 별도로 만들어주었지? 라고요 ㅎ

그것은 재귀함수를 만들어 주려고 따로 뽑아주었습니다.

재귀함수란 자기 자신을 다시 호출하는 함수입니다.

재귀함수가 없이 그냥 입력하는 구문에

1
2
3
4
5
6
7
try {
            intTypeClass.multiply(scanner.nextInt());
        } catch (Exception e) {
            System.out.println("숫자로 다시 입력해주세요.");
            scanner.next();
            intTypeClass.multiply(scanner.nextInt());
        }

이렇게 입력하면 되는거 아냐? 라고 생각하실수도 있습니다.
이렇게 입력하면 어떻게 될까요?
한번은 catch 구문에서 잡아줄것입니다. 그리고 다시입력하라고 하겠지요.
근대 또다시 문자를 입력하면?
RuntimeException 이 발생할것입니다.
결론은 한번만 잡아주게 됩니다.
그래서 예제와 같이 재귀함수로 만들어 자기 자신을 다시 실행할수 있도록 만들어 주었습니다.

이번강의에서는 try catch finally (예외처리) 에 대해서 알아보았습니다.
하지만 try catch finally 사용할때 또 사용되는 것이 있습니다.
바로 throw 라는 것이 있습니다.
다음 30강에서는 throw 에 대해서 알아보도록 하겠습니다. 모두 수고하셨습니다! ^^


댓글