1. 예외 (Exception)처리 



- 예외 : 프로그램 실행도중에 예기치 못하게 발생되는 경미한 에러


- 예외처리 : 예외가 발생되었을때 이에 대한 적절한 처리를 하는것


- 형식


try{

     예외가 발생될수 있는 실행문장;

      ...

} catch(예외타입1 참조변수){

      예외가 발생되었을때의 적절한 처리문장;

      ....

}finally{

      예외와 상관없이 무조건 수행해야 할 문장;

       ...

}

==> 예외가 발생될수 있는 문장을 try{}블록으로 묶고 catch 절에서 예외가 발생되었을때 해당하는 적절한 처리를 한다.



ex>

package test01.exception;

import java.util.Scanner;


public class Test01{

    public static void main(String[] args){


        Scanner scan = new Scanner(System.in);

        

        while(true){


            System.out.println("첫번째 수 입력(종료:0)");

            int a=scan.nextInt();


            if(a==0){

                break;

            }


            System.out.println("두번째 수 입력");

            int b=scan.nextInt();


            try{

                int c=a/b;

                System.out.println(a+"/"+b+"="+c);

            }catch(ArithmeticException e){

                System.out.println("오류메시지:" + e.getMessage());

                System.out.println("0으로 나눌수 없습니다.");

                continue;

            }            

        }

    }

}



ex>

package test01.exception;

import java.util.InputMismatchException;

import java.util.Scanner;


public class Test02{


    public static void main(String[] args){


        Scanner scan = new Scanner(System.in);

        System.out.println("1st:");


        try{

            int n1=scan.nextInt();

            System.out.println("2st:");

            int n2=scan.nextInt();

            int n3=n1/n2;

            System.out.println("나누기한 값 "+ n3);

        }catch(InputMismatchException ie){

            System.out.println("숫자만 입력하세요.");

        }catch(ArithmeticException ae){

            System.out.println("0으로 나눌수 없습니다.");

        }


        System.out.println("Exit!!");

    }

}




자바의 모든 예외는 Exception의 자식클래스이므로 Exception은 모든 예외를 처리할 수 있다.

catch절에서 Excepion은 모든 예외를 처리할수는 있으나 자식예외보다 먼저 위치할 수는 없다.

ex>

package test01.exception;

import java.util.InputMismatchException;

import java.util.Scanner;


public class Test03{


    private static Scanner scan;


    public static void main(String[] args) {

        scan = new Scanner(System.in);

        System.out.println("1st:");

        try{

            int n1=scan.nextInt();

            System.out.println("2st:");

            int n2=scan.nextInt();

            int n3=n1/n2;

            System.out.println("나누기한 값 "+ n3);

        // 모든 예외는 Exception타입으로 처리할수 있다.

        }catch(InputMismatchException e){

            System.out.println("숫자만 입력합니다.");

        }catch(Exception ie){

        // 부모예외가 반드시 아래에 와야 함.!!

            System.out.println(ie.getMessage());

        }

        System.out.println("Exit!!");

    }

}





2. Exception의 종류


 - 자바에는 두가지 종류의 익셉션이 있다.


 1) Checked Exception


 - RuntimeException을 상속받지 않은 예외클래스


 - 반드시 try~catch절로 예외처리를 해야 하며 예외처리를 하지 않으면 컴파일시에 오류를 발생시킨다.

 예) IOException, FileNoFoundException,...



 2) UnChecked Exception


 - RuntimeException을 상속받은 예외클래스


 - try~catch절로 예외처리를 하지 않아도 컴파일시에 오류가 발생되지 않으며 프로그래머가 선택적으로 try~catch로 처리한다.

 예) NumberFormatException, ArithmeticException,...




EX>

package test01.exception;

import java.io.*;


public class Test04{


    public static void main(String[] args){


        //String a="10  00";

        //int n=Integer.parseInt(a);

        

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.println("keyboard로 부터 숫자를 입력받다.");

        

        //keyboard로 부터 한줄 입력받

        try{

            String num=br.readLine();

            int n1=Integer.parseInt(num);

            System.out.println(num);

        }catch(IOException ie){

            System.out.println(ie.getMessage());

        }catch(NumberFormatException e){

            System.out.println("숫자만");

        }

    }

}





3. 예외처리방법


 - 자바에서는 예외처리방법이 두가지가 있다.


 방법1) 예외가 발생될수 있는 문장을try~catch로 직접 처리


 방법2) 자신이 직접 처리하지 않고 throws로 예외를 떠넘기는 방법이 있다.

  throws로 떠넘길때는 이를 호출하는 곳에서 try~catch로 처리해야 한다.



ex> 방법 1 예외가 발생될수 있는 문장을try~catch로 직접 처리

package test01.exception;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;


public class Test05{


    public static void main(String[] args){


        String name=input("이름입력");

        System.out.println(name);


        String phone=input("전화번호입력");

        System.out.println(phone);

    }


    public static String input(String msg){


        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.println(msg);

        String str="";

        

        try{

            str=br.readLine();

            return str;

        }catch(IOException ie){

            System.out.println(ie.getMessage());

            return null;

        }finally{

            System.out.println("finally");

        }

    }

}



ex> 방법 2 throws로 예외를 떠넘기는 방법

package test01.exception;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;


public class Test06{


    public static void main(String[] args){


       try{

            String name;

            

            name =input("이름입력");            

            System.out.println(name);


            String phone=input("전화번호입력");

            System.out.println(phone);


       }catch(IOException ie){

            System.out.println(ie.getMessage());

        }

    }

    

    // 자신이 처리하지 않고 throws로 예외를 넘김.--> 메소드를 호출한 곳에서 try~catch로 처리한다.

    public static String input(String msg)throws IOException

    {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        System.out.println(msg);

        String str="";

        str=br.readLine();

        return str;

    }

}





ex> 값 2개 입력받아 나눗셈 실행하기.

package test01.exception;

import java.util.Scanner;


public class Test07{


    public static void main(String[] args){


        Scanner scan = new Scanner(System.in);

        

        System.out.println("1st :");

        int n1=scan.nextInt();


        System.out.println("2st :");

        int n2=scan.nextInt();

        

        try{

            int n3=div(n1,n2);

            System.out.println("나눗셈 한 값 :" + n3);

        }catch(ArithmeticException ae){

            System.out.println("0으로 나눌수 없습니다.");

        }finally{

            System.out.println("무조건 실행");

        }

        System.out.println("Exit!!");

    }

    public static int div(int n1, int n2) throws ArithmeticException{

        int n3=n1/n2;

        return n3;

    }

}





4. 예외를 강제로 발생시키기


 문법적인 오류는 아니더라도 논리적으로 오류가 있을때 예외를 강제로 발생시킬수 있다.


 형식> throw 예외객체;

 


EX> 가로,세로 값으로 넓이 구하기. 강제 예외  발생

package test01.exception;

public class Test08{


    public static void main(String[] args){


        //사각형 가로,세로

        int x=100,y=-200;


        try{

            //사각형넓이 구하기

            int rectArea = area(x,y);

            System.out.println("사각형 넓이:" + rectArea);

        }catch(Exception e){

            System.out.println(e.getMessage());

        }

    }


    public static int area(int x, int y) throws Exception

    {

        //Exception e=new Exception("가로,세로는 0보다 커야 한다.");

        

        // 논리적으로 잘못된 값이 들어오면

        if(x<=0 || y<=0){

            //강제로 예외객체 발생.

            throw new Exception("가로,세로는 0보다 커야 한다.");

        }

        int z=x*y;

        return z;

    }

}




ex> 사용자 예외처리 클래스

package test01.exception;


class RectException extends Exception

{

    public RectException(String msg)

    {

        super(msg);

    }

}


public class Test09

{

    public static void main(String[] args)

    {

        // TODO Auto-generated method stub

        int a=10, b=-10;

        

        try{

            // 논리적으로 잘못된값이 들어온 경우

            if(a<=0 || b<=0){

                //사용자가 만든 예외객체 생성해서 던지기

                throw new RectException("가로,세로 길이는 0보다 크게");

            }

        }catch(RectException re){

            System.out.println(re.getMessage());

            return;

        }

        

        int area=a*b;

        System.out.println("넓이:" + area);

    }

}




 

 

'JAVA' 카테고리의 다른 글

자바 IO ( Ⅱ )  (0) 2014.09.12
자바 IO - Stream ( Ⅰ )  (0) 2014.09.12
Calendar 클래스  (0) 2014.09.12
자료구조 - ArrayList / 제네릭 클래스 / 확정for 문  (0) 2014.09.12
자료구조 - Map  (0) 2014.09.12

+ Recent posts