[Java] 자바 이클립스 JDBC 3. try ~ catach~ 를 이용하여 자원 해제시키기


JDBC 프로그래밍 : 자원의 해제


방법 1) finally 블록의 이용



finally를 통한 자원 헤제의 예제


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test03_1 {
  public static void main(String[] args) {
 
    Connection con = null;
    Statement stmt = null;
    ResultSet rs = null;
   
    try {
      com.mysql.jdbc.Driver mysqlDriver = new com.mysql.jdbc.Driver();
      DriverManager.registerDriver(mysqlDriver);
     
      con = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/데이트베이스명" /* 연결할 DMBS와 데이터베이스 정보 */
        "유저명", /* 사용자 아이디*/
        "1111" /* 사용자 암호 */);
   
      stmt = con.createStatement();
      rs = stmt.executeQuery("select mno, name, tel, email from memb");
      while (rs.next()) {
        System.out.printf("%d, %s, %s, %s\n",
            rs.getInt("mno"),
            rs.getString("name"),
            rs.getString("tel"),
            rs.getString("email"));
      }
    } catch (Exception e) {
      e.printStackTrace();
    } finally {
        // try 블록 안에 한꺼번에 close()를 써주게 되면 앞에 있는 close()에서 오류가 났을 경우,
        // 그 다음에 오는 close()를 실행하지 않고 예외를 던지기 때문에 각각 try 문을 써줘야 한다.
        try {rs.close();} catch (Exception e) {}
        try {stmt.close();} catch (Exception e) {}
        try {con.close();} catch (Exception e) {}
    }
  }

}






방법 2) 클로저 (closure)를 이용한 방법



try (...) 안에 클로저 기법을 이용해 자동 자원 해제를 설정해주는 예제


import java.sql.Connection;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Test03_2 {
  public static void main(String[] args) {
    try {
      com.mysql.jdbc.Driver mysqlDriver = new com.mysql.jdbc.Driver();
      DriverManager.registerDriver(mysqlDriver);
     
    } catch (Exception e) {
      e.printStackTrace();
      return;
    }
   
    try ( // 이 괄호 안에 선언하는 변수는 오직 java.lang.AutoCloseable 구현체 만이 가능하다.
      Connection con = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/데이터베이스명",
        "유저명",
        "1111");
   
      Statement stmt = con.createStatement();
      ResultSet rs = stmt.executeQuery("select mno, name, tel, email from memb");
    ) {
      while (rs.next()) {
        System.out.printf("%d, %s, %s, %s\n",
            rs.getInt("mno"),
            rs.getString("name"),
            rs.getString("tel"),
            rs.getString("email"));
      }
     
    } catch (Exception e) {
      e.printStackTrace();
    }
  }
}





블로그 이미지

필로그래머

,

[Java] (5) 예외처리 (exception) - 사용자 정의 예외 던지기


예외처리 : 사용자 정의 예외 던지기

 - 예외 상황이 발생했을 때 예외 객체를 만들어 던진다.

 - 예외 객체를 만들기 위해 예외 클래스를 선택해야 하는데,

   그 선택의 기준은 클래스의 이름이다.

   즉 예외 상황을 잘 표현할 수 있는 이름을 가진 클래스를 선택한다.


 - 그런데 예외 상황에 딱 맞는 마땅한 예외 클래스가 없을 경우,

   또는 예외 상황을 좀 더 잘 표현하고 싶을 경우,

   개발자가 직접 예외 클래스를 만들어 던질 수 있다.

 - 이때 그 클래스는 애플리케이션 예외이어야 하기 때문에

   보통 java.lang.Exception을 상속 받아서 만든다.


 - Exception을 상속 받아 뭔가 특별한 기능을 추가한다기 보다,

   예외 상황을 잘 드러내는 이름을 가진 클래스를 만든다는 의미로

   서브 클래스를 작성해야 한다.


- 보통 상속은 기존 클래스의 기능을 확장하는 것에 있지만,

  예외클래스들의 상속은 기능을 더 보태는 개념이 아니다.

  예외 클래스의 상속은 '기능 추가'가 목적이 아니라, 각 예외를 이름 별로

  구분하는 것이 목적이다. 이름


 

사용자 정의 예외 클래스를 만드는 이유 : 

 1) 기능을 확장하기 위한 것이 아니다.

 2) 예외 상황이 발생했을 때, 클래스 이름으로 즉기 그 예외 상황을 파악하려는 것이다.

 3) 그래서 예외 클래스의 상속 관계는 이름으로 예외를 분류하는 데 의미를 두고 있다.

 

 


사용자 정의 예외 클래스의 예제


public class Test07 {

  static class InvalidValueScopeException extends IllegalArgumentException {
    public InvalidValueScopeException() {
      super();
      // TODO Auto-generated constructor stub
    }
    public InvalidValueScopeException(String message, Throwable cause) {
      super(message, cause);
      // TODO Auto-generated constructor stub
    }
    public InvalidValueScopeException(String s) {
      super(s);
      // TODO Auto-generated constructor stub
    }
    public InvalidValueScopeException(Throwable cause) {
      super(cause);
      // TODO Auto-generated constructor stub
    }
   
  }
  public static void main(String[] args) {
    try  { // try 블록 안에 예외를 던질 수 있는 코드를 넣고
      if (args.length < 1)
        throw new IllegalArgumentException("애플리케이션 아규먼트가 없습니다.");
      int age = Integer.parseInt(args[0]);
     
      if (age < 1)
        throw new InvalidValueScopeException("나이가 유효하지 않습니다.");
     
      System.out.println(age);
    } catch (Throwable ex) {
      ex.printStackTrace();
    }
  }
 }


- 실행 결과 :



블로그 이미지

필로그래머

,

[Java] 자바 (2) 예외처리 - 1. throw throwable 2. Error 예외와 Exception 예외 비교


예외처리 : 예외 발생 시 그 정보를 전달하고 전달 받는 방법

 - 예외 정보를 호출자에게 전달하는 방법

    throw [Throwable 객체];

     - 예외 정보를 담은 객체란 무엇인가?

        java.lang.Throwable 타입의 객체이다.

        - java.lang.Throwable 클래스 계층 구조

    Throwable           

     | --> Error

     | --> Exception

             | --> RuntimeException

                     | --> NullPointerException

             | --> IOException

               | --> FileNotFoundException

               | --> EOFException

       | -->  SQLException 

                   | -->  그외 (..)


        - 예외 종류

           1) 시스템 예외(Error 타입 예외)

               - JVM이 발생시키는 예외이다.

    - 개발자가 처리하는 예외가 아니다.

    - 개발자가 처리하기엔 치명적인 예외라서 가능한 JVM을 종료해야 한다.

    - 이 예외가 발생했을 때,

       개발자는 JVM이 종료되기 전에 작업 중인 파일을 저장하거나

       예외에 대한 로그를 파일에 쓰거나

       사용자에게 예외 상황을 출력하는 등의 마무리 작업을 하고 

       JVM을 종료한다.


           2) 애플리케이션 예외(Exception 타입 예외)

               - 애플리케이션에서 발생하는 예외이다.

               - 개발자가 처리해야 하는 예외이다.

               - 예외를 처리한 후에 애플리케이션을 계속 실행할 수 있다.


 - 예외 정보를 받는 방법

    try {

예외를 던지는 코드

    } catch (예외를 받을 변수 선언) {

예외를 처리하는 코드

    }




예외처리 예제


public class Test03 {
  // 메서드를 실행하다가 예외를 던질 수 있는 경우
  // => 메서드 선언부에 어떤 예외가 던져질 수 있는지 적어야 한다.
  public static float divide(float a, float b) throws Throwable{
    if (b == 0) {
      // 예외 상황이 발생하면, 호출자에게 그 정보를 전달해야 한다.
      throw new Throwable("0으로 나누지 마세요!");
    }
    return a / b;
  }
 
  public static void main(String[] args) {
    try { // 예외를 던질 수 있는 코드는 try 블록 안에 둔다.
      float result = divide(10, 2);
      System.out.println(result);
      result = divide(10, 0);
      System.out.println(result);
    } catch (Throwable ex) {
      System.out.println(ex.getMessage());
    }
System.out.println("Hello"); // 예외가 발생하든 안하든 실행!
  }

}


 - 실행결과 : 

5.0

0으로 나누지 마세요!



 - 예외 처리 문법의 이점 

    1) 메서드가 리턴하든 안하든, 

       리턴하는 값의 타입이 무엇이든 

       호출자에게 예외 정보를 전달할 수 있다.

    2) 예외를 처리하는 입장에서는 try 블록 안에는 예외 상황이 아닐 때의 

        작업 코드를 두고, catch 블록 안에는 예외를 처리하는 코드를 둠으로써

        정상 작업 코드와 예외 처리 코드를 분리하는 효과가 있다.

         -> 코드의 가독성 ↗

    3) 예외가 발생하더라도 적당한 처리를 한 후

        시스템을 멈추지 않고 계속 실행시킬 수 있다.



블로그 이미지

필로그래머

,