예외처리 배효철 th1g@nate.com 1
목차 예외와예외클래스 실행예외 예외처리코드 예외종류에따른처리코드 자동리소스닫기 예외처리떠넘기기 사용자정의예외와예외발생
예외와예외클래스 구문오류
예외와예외클래스 구문오류가없는데실행시오류가발생하는경우
예외와예외클래스 import java.util.scanner; public class ExceptionExample1 { public static void main (String[] args) { Scanner rd = new Scanner(System.in); int divisor = 0; int dividend = 0; System.out.print(" 나뉨수를입력하시오 :"); dividend = rd.nextint(); System.out.print(" 나눗수를입력하시오 :"); divisor = rd.nextint(); System.out.println(dividend+" 를 "+divisor+" 로나누면몫은 "+dividend/divisor+" 입니다."); 5
예외와예외클래스 오류의종류 에러 (Error) 하드웨어의잘못된동작또는고장으로인한오류 에러가발생되면프로그램종료 정상실행상태로돌아갈수없음 예외 (Exception) 사용자의잘못된조작또는개발자의잘못된코딩으로인한오류 예외가발생되면프로그램종료 예외처리추가하면정상실행상태로돌아갈수있음
예외와예외클래스 예외의종류 일반 ( 컴파일체크 ) 예외 (Exception) 예외처리코드없으면컴파일오류발생 실행예외 (RuntimeException) 예외처리코드를생략하더라도컴파일이되는예외 경험따라예외처리코드작성필요
예외와예외클래스 예외클래스 자주사용되는예외타입
실행예외 (RuntimeException) NullPointerException 객체참조가없는상태 null 값갖는참조변수로객체접근연산자인도트 (.) 사용했을때발생 ArrayIndexOutOfBoundsException 배열에서인덱스범위초과하여사용할경우발생
실행예외 (RuntimeException) ClassCastException 타입변환이되지않을경우발생 정상코드 예외발생코드
자주발생하는예외 11
예외처리코드 (try-catch-finally) 예외처리코드 예외발생시프로그램종료막고, 정상실행유지할수있도록처리 일반예외 : 반드시작성해야컴파일가능 실행예외 : 컴파일러가체크해주지않으며개발자경험의해작성 try catch finally 블록이용해예외처리코드작성 finally 블록은생략가능
예외처리코드 (try-catch-finally) import java.util.scanner; public class ExceptionExample2 { public static void main (String[] args) { Scanner rd = new Scanner(System.in); int divisor = 0; int dividend = 0; System.out.print(" 나뉨수를입력하시오 :"); dividend = rd.nextint(); System.out.print(" 나눗수를입력하시오 :"); divisor = rd.nextint(); try { System.out.println(dividend+" 를 "+divisor+" 로나누면몫은 "+ dividend/divisor+" 입니다."); catch (ArithmeticException e) { System.out.println("0 으로나눌수없습니다."); finally { System.out.println( 이부분은무조건나와요."); 13
예외처리코드 (try-catch-finally) public class ArrayException { public static void main (String[] args) { int[] intarray = new int[5]; intarray[0] = 0; try { for (int i = 0; i < 5; i++) { intarray[i+1] = i+1 + intarray[i]; System.out.println("intArray["+i+"]"+"="+intArray[i]); catch (ArrayIndexOutOfBoundsException e) { System.out.println(" 배열의인덱스가범위를벗어났습니다."); 14
예외처리코드 (try-catch-finally) public class NumException { public static void main (String[] args) { String[] stringnumber = {"23", "12", "998", "3.141592"; try { for (int i = 0; i < stringnumber.length; i++) { int j = Integer.parseInt(stringNumber[i]); System.out.println(" 숫자로변환된값은 " + j); catch (NumberFormatException e) { System.out.println(" 정수로변환할수없습니다."); 15
예외종류에따른처리코드 다중 catch 예외별로예외처리코드다르게구현
예외종류에따른처리코드 catch 순서 상위클래스가위에위치해야
예외종류에따른처리코드 멀티 (multi) catch (p.436~437) 자바 7 부터는하나의 catch 블록에서여러개의예외처리가능 동일하게처리하고싶은예외를 로연결
자동리소스닫기 try-with-resources 예외발생여부와상관없음 사용했던리소스객체의 close() 메소드호출해리소스닫음 리소스객체 각종입출력스트림, 서버소켓, 소켓, 각종채널 java.lang.autocloseable 인터페이스구현하고있어야함
자동리소스닫기 SomeResource resource = null; try { resource = getresource(); use(resource); catch(...) {... finally { if (resource!= null) { try { resource.close(); catch(...) { try (SomeResource resource = getresource()) { use(resource); catch(...) {...
예외정보얻기 getmessage() 예외발생시킬때생성자매개값으로사용한메시지리턴 원인세분화하기위해예외코드포함 ( 예 : 데이터베이스예외코드 ) catch() 절에서활용
예외정보얻기 public class ExampleGetMessage { public static void main (String[] args) { int a = 100, b = 0 ; int result ; try { result = a / b ; catch (ArithmeticException e) { System.out.print( 발생오류 ==>") ; System.out.println(e.getMessage()) ; 22
예외떠넘기기 throws 메소드선언부끝에작성 메소드에서처리하지않은예외를호출한곳으로떠넘기는역할
사용자정의예외와예외발생 사용자정의예외클래스선언 자바표준 API 에서제공하지않는예외 애플리케이션서비스와관련된예외 Ex) 잔고부족예외, 계좌이체실패예외, 회원가입실패예외. 사용자정의예외클래스선언방법
사용자정의예외와예외발생 예외발생시키기 코드에서예외발생시키는법 호출된곳에서발생한예외를처리하도록
class UserException extends Exception { private static final long serialversionuid = 1L; public UserException() { public UserException(String msg) { super(msg); class Account { private long balance; public Account() { public long getbalance() { return balance ; public void setbalance(long balance) { this.balance = balance ; public void deposit(int money) { balance += money; public void withdraw(int money) throws UserException { if (balance < money) { throw new UserException(" 잔고부족 : "+(money - balance)+" 모자람 "); balance -= money ; 26
사용자정의예외와예외발생 public class AccountExam { public static void main(string[] args) { Account act = new Account(); act.deposit(25000); System.out.println(" 예금액 : " + act.getbalance()); try{ act.withdraw(50000); catch (UserException e) { String msg = e.getmessage(); System.out.println(msg); System.out.println(); e.printstacktrace(); 27
사용자정의예외와예외발생 public class ExampleThrow { public static void main (String[] args) { int a = 100, b = 0 ; int result ; try { if (b == 0) throw new Exception( 0 으로나누려고요? 안됩니다. ); result = a / b ; catch (Exception e) { System.out.print( 발생오류 ==>") ; System.out.println(e.getMessage()) ; 28
예외정보얻기 printstacktrace() 예외발생코드추적한내용을모두콘솔에출력 프로그램테스트하면서오류찾을때유용하게활용