본문 바로가기
IT만들기/Java

Java try/catch/throw

by 커피향처럼 2009. 1. 7.

try
{
    // 예외를 발생시킬 수 있는 코드
}
catch(발생할 수 있는 예외)
{
    // 발생한 예외를 처리하기 위한 코드
}
finally

    // 예외가 발생하든 안하든 필수로 처리하기 위한 코드
    // 예외 발생되더라도 예외발생후 실행
    // 정상적으로 try문이 실행되더라도 실행됨
    // finally 문은 try/catch문에서 써주지 않아도 됨.
}

주의 : catch(SQLException e)와 같이 코딩하였다면 try문 안에는 SQLException 예외를 발생할수 있는 코드가 필수로 들어와야 한다. SQLException을 발생할수 있는 코드가 누락되면 컴파일시에 exception java.sql.SQLException is never thrown in body of corresponding try statement 에러가 발생한다.

// 오라클 DB 접속 예제

import! java.sql.*;

public class Jdbc020{
 public static void main( String args[] ) throws Exception{
      Class.forName("oracle.jdbc.driver.OracleDriver");
      Connection conn = null;
      try{
           conn = DriverManager.getConnection( "jdbc:oracle:thin:@127.0.0.1:1521:ORA9", "myid","mypwd");
           // .....
      }
      catch( SQLException e ){
          // DB Connect 실패시 오류
           e.printStackTrace();
      }
      catch( Exception e2 ){ 
         // SQLException 이외의 모든 예외 처리
      }
      finally{
          if( conn != null ) conn.close();
      }
  }
}

// 다음은 어떤 수를 0으로 나눌 때 발생하는 예외를 처리하는 코드이다. 
try
{
    System.out.println(10/0);
}
catch(ArithmeticException e)
{
    System.out.println(e.getMessage());
    System.out.println(e.toString());
    e.printStackTrace();
}

그럼 어떤 클래스를 만들때 try/catch 문으로 예외처리를 할 수 있도록 하려면 어떻게 해야 할까? 예외상황이 발생할 때 throw 해주면 된다.

 던지는(throw) 방법은 다음과 같다.
throw new Exception();
throw new Exception("cannot devided by zero.");

 사용자가 예외 클래스를 정의하는 방법은 다음과 같다.
public class NewException extends Exception
{
    public NewException() {};
    public NewException(String s)
    {
        super(s);
    }

    public String toString()
    {
        return "User defined exception class";
    }
}

메소드 밖에서 예외를 처리하는 방법은 없을까? 메소드 밖에서 예외를 처리하기 위해서는 메소드가 발생시킬 수 있는 예외들을 throws문을 이용하여 명시해주어야 한다. throws문에 의해 명시된 예외는 해당 메소드에서 try/catch문으로 처리하지 않아도 되지만, 메소드를 호출한 곳으로 예외가 전파되기 때문에 호출한 쪽에서는 해당 예외를 try/catch문을 이용해 처리해주거나 throws문을 통해 상위 레벨의 메소드로 다시 전파해주어야 한다. 예외가 가장 상위 레벨의 메소드로 전파되었는데도 예외를 처리하지 못했다면 JVM은 적절한 메세지를 출력하고 프로그램을 종료하게 된다. 

public void test() throws ArtimeticException, ArrayIndexOutOfBoundsException
{
    int n[] = {0, 1, 2, 3, 4};
    System.out.println(n[10]/n[0]);
}


댓글