[JAVA] 예외처리(exception)

자바 예외처리

자바 예외처리 계층 구조

java-exception-throwable

예외(Exeption) , 에러(Error)

Checked Exception

  • RuntimeException 및 Error를 제외하고 Throwable 클래스를 직접 상속하는 클래스를 확인 된 예외
  • 예 : IOException, SQLException
  • compile-time error : 컴파일시 발생하는 에러

Unchecked Exception

  • RuntimeException을 상속받는 클래스는 검사되지 않은 예외
  • 예 : ArithmeticException, NullPointerException, ArrayIndexOutOfBoundsException 등
  • runtime error : 프로그램 실행할 때 발생하는 에러

Error

  • 복구 되지 않는 에러
  • OutOfMemoryError, VirtualMachineError, AssertionError

예외처리 구문

예외를 처리하려면 사용해야 함

try-catch-finally

  • try : 예외 코드를 배치 할 블록을 지정하는 데 사용
  • catch : 예외를 처리하는 데 사용
  • finally : 예외 처리 여부에 관계없이 실행

  • 문법
try {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}finally {
   // The finally block always executes.
}
  • 예제
public class ExcepTest {

   public static void main(String args[]) {
      int a[] = new int[2];
      try {
         System.out.println("Access element three :" + a[3]);
      } catch (ArrayIndexOutOfBoundsException e) {
         System.out.println("Exception thrown  :" + e);
      }finally {
         a[0] = 6;
         System.out.println("First element value: " + a[0]);
         System.out.println("The finally statement is executed");
      }
   }
}
  • output
Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3  
First element value: 6  
The finally statement is executed  

try-with-resources

  • Java 7에 도입 된 새로운 예외 처리 메커니즘
  • 자동 자원 관리
  • try catch 블록 내에 사용 된 자원을 자동으로 닫음
  • 예제1 : 괄호 안의 리소스 선언을 제외하고 모든 것은 try 블록의 일반적인 try / catch 블록과 동일
import java.io.FileReader;
import java.io.IOException;

public class Try_withDemo {

   public static void main(String args[]) {
      //try : use the resource
      try(FileReader fr = new FileReader("E://file.txt")) {
         char [] a = new char[50];
         fr.read(a);   // reads the contentto the array
         for(char c : a)
         System.out.print(c);   // prints the characters one by one
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
}
  • 예제2 : sql connection에서도 사용 가능
public static void viewTable(Connection con) throws SQLException {

    String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";

    try (Statement stmt = con.createStatement()) {
        ResultSet rs = stmt.executeQuery(query);

        while (rs.next()) {
            String coffeeName = rs.getString("COF_NAME");
            int supplierID = rs.getInt("SUP_ID");
            float price = rs.getFloat("PRICE");
            int sales = rs.getInt("SALES");
            int total = rs.getInt("TOTAL");

            System.out.println(coffeeName + ", " + supplierID + ", " +
                               price + ", " + sales + ", " + total);
        }
    } catch (SQLException e) {
        JDBCTutorialUtilities.printSQLException(e);
    }
}

throws-throw

  • throws : 예외를 선언하는 데 사용되나, 예외는 발생하지 않음. 메소드에 예외가 발생할 수 있음을 지정. 항상 메소드 서명과 함께 사용
  • throw : 예외를 발생시키는 데 사용됨 (새로 인스턴스화 된 예외 또는 방금 포착 한 예외를 예외로 처리)
  • throws 는 확인 된 예외 처리를 연기하는 데 사용 되며 throw 는 명시 적으로 예외를 호출하는 데 사용
import java.io.*;
public class className {

   // RemoteException을 던진다는 것을 선언
   public void deposit(double amount) throws RemoteException {
      // Method implementation
      // RemoteException 예외 처리
      throw new RemoteException();
   }
   // Remainder of class definition
}

references

https://www.tutorialspoint.com/java/java_exceptions
https://www.javatpoint.com/exception-handling-in-java
https://www.geeksforgeeks.org/exceptions-in-java/?ref=lbp
https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html