예외와예외클래스 예외처리 514760-1 2016 년가을학기 12/08/2016 박경신 오류의종류 에러 (Error) 하드웨어의잘못된동작또는고장으로인한오류 에러가발생되면 JVM실행에문제가있으므로프로그램종료 정상실행상태로돌아갈수없음 예외 (Exception) 사용자의잘못된조작또는개발자의잘못된코딩으로인한오류 예외가발생되면프로그램종료 예외처리 추가하면정상실행상태로돌아갈수있음 예외와예외클래스 예외의종류 일반예외 ( 컴파일체크 Exception) 컴파일하는과정에서예외처리코드가필요한지검사 예외처리코드없으면컴파일오류발생 실행예외 (RuntimeException) 예외처리코드를생략하더라도컴파일이되는예외 ' 경험 따라예외처리코드작성필요 예외클래스 예외클래스 Java 는예외를클래스로관리 JVM 이프로그램을실행하는도중에예외가발생하면해당예외클래스로객체를생성 예외처리코드에서예외객체를이용
실행예외 (RuntimeException) NullPointerException 객체참조가없는상태 null 값갖는참조변수로객체접근연산자인도트 (.) 사용했을때발생 ArrayIndexOutOfBoundsException 배열에서인덱스범위초과하여사용할경우발생 실행예외 (RuntimeException) NumberFormatException 숫자로변환될수없는문자가포함되어있는문자열을숫자로변경할경우 Integer.parseInt(String s) Double.parseDouble(String s) public class NumberFormatExceptionExample { String data1 = "100"; String data2 = "a100"; 실행예외 (RuntimeException) ClassCastException 타입변환이되지않을경우발생 정상코드 예외발생코드 실행예외 (RuntimeException) ClassCastException 타입변환이되지않을경우발생 public class NumberFormatExceptionExample { Dog dog = new Dog(); changedog(dog); Cat cat = new Cat(); changedog(cat); public static void changedog(animal animal) { //if(animal instanceof Dog) { Dog dog = (Dog) animal; //ClassCastException // class Animal { class Dog extends Animal { class Cat extends Animal {
예외처리코드 (try-catch-finally) 예외처리코드 예외발생시프로그램종료막고, 정상실행유지할수있도록처리 일반예외 : 반드시작성해야컴파일가능 실행예외 : 컴파일러가체크해주지않으며개발자경험의해작성 try catch finally 블록이용해예외처리코드작성 예외처리코드 (try-catch-finally) public class TryCatchFinallyRuntimeExceptionExample { String data1 = null; String data2 = null; data1 = args[0]; data2 = args[1]; catch(arrayindexoutofboundsexception e) { System.out.println("."); System.out.println("[ ]"); System.out.println("java TryCatchFinallyRuntimeExceptionExample num1 num2"); return; 실행시매개값을잘못주었을경우예외발생 catch(numberformatexception e) { System.out.println("."); finally { 다중 catch 하나의 try 블록내부에서다양한종류의예외발생시 각예외별로예외처리코드 (catch 블록 ) 다르게구현 단하나의 catch 블록만실행 public class CatchByExceptionKindExample { String data1 = args[0]; String data2 = args[1]; 실행시매개값을잘못주었을경우예외발생 catch(arrayindexoutofboundsexception e) { System.out.println("."); System.out.println("[ ]"); System.out.println("java CatchByExceptionKindExample num1 num2"); catch(numberformatexception e) { System.out.println("."); finally {
하위예외는상위예외를상속 하위예외는상위예외타입도됨 catch 순서 상위예외가아래에위치해야 public class CatchOrderExample { String data1 = args[0]; String data2 = args[1]; catch(arrayindexoutofboundsexception e) { System.out.println("."); catch(exception e) { System.out.println("."); finally { 상위예외 Exception 이위에있을경우 상위예외 Exception 이아래에있을경우 멀티 (multi) catch 자바 7 부터는하나의 catch 블록에서여러개의예외처리가능 동일하게처리하고싶은예외를 로연결 public class MultiCatchExample { String data1 = args[0]; String data2 = args[1]; 실행시매개값을잘못주었을경우예외발생 catch(arrayindexoutofboundsexception NumberFormatException e) { System.out.println(".."); catch(exception e) { System.out.println(" "); finally {
자동리소스닫기 try-with-resources 예외발생여부와상관없음 사용했던리소스객체의 close() 메소드호출해리소스닫음 리소스객체 각종입출력스트림, 서버소켓, 소켓, 각종채널 java.lang.autocloseable 인터페이스구현하고있어야함 예외떠넘기기 (throws) throws 메소드선언부끝에작성 메소드내에서처리하지않은예외를메소드호출한곳 (calling method) 으로떠넘기는역할 예외떠넘기기 (throws) throws throws 선언된메소드를호출하는메소드 (calling method) 는 1. 반드시 try 블록내에서호출 2. catch 블록에서떠넘겨받은예외를처리함 3. try-catch 블록으로예외처리를하지않고 throws 키워드로자신도다시예외를떠넘길수있음 3. throws ClassNotFoundException 1. try block 1.2 2. catch block 사용자정의예외와예외발생 사용자정의예외 (user-defined exception) 클래스선언 자바표준 API 에서제공하지않는예외 애플리케이션서비스와관련된예외, Application Exception E.g. 잔고부족예외, 계좌이체실패예외, 회원가입실패예외. 사용자정의예외클래스선언방법 1. 예외클래스상속 일반예외 : Exception class 상속 실행예외 : RuntimeException class 상속 2. 생성자정의 매개변수없는기본생성자, String 타입의매개변수를갖는생성자 1.1 예외발생
사용자정의예외와예외발생 사용자정의예외와예외발생 예외발생시키기 (throw) 코드에서예외발생시키는법 - 예외객체생성 호출한곳에서발생한예외를처리하도록 public class BalanceInsufficientException extends Exception { public BalanceInsufficientException() { public BalanceInsufficientException(String message) { super(message); public class Account { private long balance; public Account() { 1. Exception class 상속 2. constrctors 생성 public long getbalance() { return balance; public void deposit(int money) { balance += money; 4. 호출한곳에서발생한예외를처리하도록함 public void withdraw(int money) throws BalanceInsufficientException { if(balance < money) { 3. 사용자정의예외발생 예외객체생성 throw new BalanceInsufficientException(" :"+(money-balance)+" ); balance -= money; 사용자정의예외와예외발생 public class AccountExample { Account account = new Account(); 예외정보얻기 getmessage() 예외발생시킬때생성자매개값으로사용한메시지리턴 // account.deposit(10000); System.out.println(" : " + account.getbalance()); // account.withdraw withdraw(30000); catch(balanceinsufficientexception e) { String message = e.getmessage(); System.out.println(message); System.out.println(); e.printstacktrace(); 5. try block 에서메소드호출 6. catch block 에서사용자정의예외처리 7. 예외정보얻기 (8 절 ) 원인세분화하기위해예외코드포함 ( 예 : 데이터베이스예외코드 ) catch() 절에서활용
예외정보얻기 printstacktrace() 예외발생코드를추적하여모두콘솔에출력 프로그램테스트하면서오류찾을때유용하게활용