티스토리 뷰

[java30강] throw throws (예외발생 및 예외처리)



이번 30강에서는 자바의 throw, throws 에 대해서 알아보겠습니다.

우선 예외를 잘모르신다면.... 28, 29강을 선학습 하고 오시길 바랍니다 ㅎ


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

[java29강] try catch finally (예외처리)          --> http://bvc12.tistory.com/194


28강 및 29강을 통해 우리는 자바 예외가 발생하는 이유와 발생시 예외를 처리하는 방법에대서 알아보았습니다.

이번강의에서는 예외를 강제적으로 발생하는방법과 또다른 예외를 처리할수 있는방법에 대해서  알아보겠습니다.


1. throw


예외를 강제로 발생시키는것이 바로 throw 입니다. 코드를 작성하는 프로그래머가 강제로 예외를 발생시키는 것입니다.

throw의 문법은 다음과 같습니다.


throw new 발생시킬 예외; 


바로 throw 예제를 살펴보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package test;
 
public class java30 {
 
    public static void main(String[] args) {
        
        try {
            throw new Exception(); // 강제로 Exception 객체를 생성하였습니다.
        } catch (Exception e) {
            System.out.println("예외를 강제로 발생했습니다.");
        }
        
    }
    
}



결과



설명


try {
            throw new Exception(); // 강제로 Exception 객체를 생성하였습니다.
        } catch (Exception e) {
            System.out.println("예외를 강제로 발생했습니다.");
        }

위 try catch 문에서 try 부분에 Exception 객체를 생성하여 throw 로 강제로 예외를 내주었습니다.

강제로 발생된 Exception 으로 catch 문이 실행되어 "예외를 강제로 발생했습니다." 라는 문구가 콘솔창에 출력이 됩니다.

그결과 콘솔창에 문구가 출력됩니다.


그럼 왜 강제로 예외를 발생시킬까요? 그건 예외를 한번더 처리하기 위함이 있습니다.

한마디로 throw + throws 를 사용할수 있다는것입니다. 그럼 아직 throws 를 모르기 때문에 throws 에대해 알아볼 필요가 있습니다.


2. throws


throws 도 예외처리를 위해 사용합니다. 그럼 앞에서 배운 try catch finally 와 다른게 뭐냐? 라고 생각하실수 있습니다.

예외를 처리하는것은 동일합니다. 하지만 예외를 상위쪽으로 미루어 처리를 하는것입니다.

왜 위쪽으로 미루어 처리를할까요? 만약 그것이 메소드라고 생각을 해봅시다.

메소드는 여러곳에서 쓰려고 만들죠? 근대 만약 그메소드에서 예외가 발생하고 예외처리를 하려고 하니깐 사용하는곳이 너~~~무 많으면...

수많은 예외처리를 try catch finally 구문에 넣어야합니다. 만약 이렇게 한구문에 모든것을 넣어버리면... 

어디서 발생했는지 찾는것도 엄청난 시간이 들것이며.. 만약 찾아서 또 추가하고... 추가했더니 이제 다른곳에서 또 예외가 발생하고..

만약 제가 코딩을 하다가 다른사람에게 넘겨주었다고 생각을 하면... 이사람도 또 똑같은 시간낭비를 할수 있습니다..

그래서! throws 를 사용하여 호출한쪽에서 처리를 하고... throws 구문에 발생할만한 예외를적어 인계자에게도 시간낭비를 줄여줄수 있습니다.

throws 문법은 

만들어진 메소드 throws 발생할 예외 { }

이런식으로 만들어놓은 메소드에 throws 발생예외를 추가적으로 적어주면 됩니다.


그럼 바로 throws 예제를 살펴보겠습니다.


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
package test;
 
public class java30 {
 
    public static void main(String[] args) {
        
        Test test = new Test();
        
        try {
            test.test("1""ㄱ"); // 숫자를 넘겨주어야 하지만 숫자와 문자를 넘겨준다.
        } catch (NumberFormatException e) {
            System.out.println("입력하신 값은 숫자가 아닙니다..."); //NumberFormatException 발생시 실행시킴
        }    
    }
    
}
 
class Test {
    
    public void test(String a, String b) throws NumberFormatException{
        int sum = Integer.parseInt(a) + Integer.parseInt(b); // 문자로 받은 a와 b의 문자를 숫자로 변환하여 더한다. (하지만 문자를 받을시 형변환과정에서 NumberFormatException 이 발생한다.)
        System.out.println("문자로 입력받은 " +a+ "," +b+ "의 합은 " + sum + "입니다."); // 문자로 받은 숫자 2개의 합을 출력한다.
    }
    
}



결과



설명



class Test {
    
    public void test(String a, String b) throws NumberFormatException{
        int sum = Integer.parseInt(a) + Integer.parseInt(b); 
// 문자로 받은 a와 b의 문자를 숫자로 변환하여 더한다.
        System.out.println("문자로 입력받은 " +a+ "," +b+ "의 합은 " + sum + "입니다."); 
// 문자로 받은 숫자 2개의 합을 출력한다.
    }
    
}


Test 라는 클레스를 별도로 만들어주고 test 메소드에 throws NumberFormatException 을 달아주었습니다. (형변환 과정에서 발생할 익셉션)

그다음 int 타입 sum 변수를 생성하여 메소드로 전달받은 문자 a, b를 parseint 로 숫자로 변경하여 더해주었습니다.

그다음 콘솔창에 입력받은 숫자와 합을 보여주었습니다.


public static void main(String[] args) {
        
        Test test = new Test();
        
        try {
            test.test("1""ㄱ"); // 숫자를 넘겨주어야 하지만 숫자와 문자를 넘겨준다.
        } catch (NumberFormatException e) {
            System.out.println("입력하신 값은 숫자가 아닙니다..."); //NumberFormatException 발생시 실행시킴
        }    
    }


메인 메소드에서는 미리 만들어주었던 클래스 Test 객체 인스턴트로 만들어주고.

try cash 문법을 사용하여 test.test 메소드의 예외처리를 해주었습니다.

test.test 메소드에 강제로 NumberFormatException 이 발생할수 있도록 "1" 과 "ㄱ" 을 전달해주었습니다.

("1" 은 문제가 없지만 "ㄱ"은 숫자로 바꿀수없는 문자이기에 parseint 사용시 NumberFormatException 이 발생합니다.)

실행결과 예상대로 NuberFormatException 이 발생하여 catch 문에 작성했던 문구가 출력됩니다.

이와같이 throws를 사용하여 메소드 안에 예외처리를 하지않고 메소드를 실행한 main 쪽에서 예외를 처리할수 있습니다.


그럼이제 위에서 언급했던 throw 와 throws 를 함께 사용할수있는 예제를 살펴보도록하겠습니다.


throw 와 throws 를 함께 사용할수있는 예제


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
package test;
 
public class java30 {
 
    public static void main(String[] args) {
        
        Test test = new Test();
        
        try {
            test.test("1""ㄱ"); // 숫자를 넘겨주어야 하지만 숫자와 문자를 넘겨준다.
        } catch (NumberFormatException e) {
            System.out.println("입력하신 값은 숫자가 아닙니다..."); //NumberFormatException 발생시 실행시킴
        }    
    }
    
}
 
class Test {
    
    public void test(String a, String b) throws NumberFormatException{
        
        try{
            int sum = Integer.parseInt(a) + Integer.parseInt(b); // 문자로 받은 a와 b의 문자를 숫자로 변환하여 더한다. (하지만 문자를 받을시 형변환과정에서 NumberFormatException 이 발생한다.)
            System.out.println("문자로 입력받은 " +a+ "," +b+ "의 합은 " + sum + "입니다."); // 문자로 받은 숫자 2개의 합을 출력한다.
        } catch (NumberFormatException e) {
            System.out.println("숫자형 문자가 아닙니다. 형변환을 할수가 없습니다.");
            throw e;
        }
        
        
    }
    
}
cs


결과




설명


class Test {
    
    public void test(String a, String b) throws NumberFormatException{
        
        try{
            int sum = Integer.parseInt(a) + Integer.parseInt(b); 
// 문자로 받은 a와 b의 문자를 숫자로 변환하여 더한다.
            System.out.println("문자로 입력받은 " +a+ "," +b+ "의 합은 " + sum + "입니다."); 
// 문자로 받은 숫자 2개의 합을 출력한다.
        } catch (NumberFormatException e) {
            System.out.println("숫자형 문자가 아닙니다. 형변환을 할수가 없습니다.");
            throw e;
        }
        
        
    }
    
}


Test 클레스의 test 메소드에 try catch 로 예외를 처리해줍니다.

catch 문에 예외를 발생한 이유를 출력해줍니다. 그리고..! throw 를 통해 다시한번 NumberFormatException 을 발생시켜 줍니다.

다시한번 발생된 NumberFormatException 의 예외는 메인에서 처리를 해줍니다.

메인쪽은 동일하므로 설명을 생략하겠습니다.

그럼 실행 결과를 보면... 출력이 2번된것을 확인할수 있습니다. 결론은 예외가 2번 실행되는것입니다.

이렇게 본다면 메소드에서 예외를 처리하고 실행한 메인쪽에서도 예외를 추가적으로 처리할수 있게됩니다.

그럼 예외처리를 분산하여 처리를 할수 있겠죠? 이건정말 핵꿀팁입니다..


이렇게해서 throw 와 throws 에 대해서 알아보았습니다.

주의하실점이.. throw throws 는 영어상..비슷하게 보이지만 엄청나게 다른애들 입니다...

이상으로 이번 throw throws 강좌를 마치도록 하겠습니다. 수고하셨습니다! ^^



댓글