ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java_Basic]예외처리(윤성우의 열혈 Java 프로그래밍)
    Java/Basic 2021. 1. 2. 19:47

    예외 

    예외적인 상황. 문법 오류가 아닌 정상적이지 않은 상황. 일반적인 예외 상황이란 사용자가 만드는 예외상황

     

    예외 처리 

    예외 상황에 대한 처리를 의미. 자바는 예외처리 메커니즘을 제공한다.

     

    import java.util.Scanner;
    
    class ExceptionCase{
    	public static void main(String[] args){	
    		Scanner kb = new Scanner(System.in);
    		System.out.print("a/b...a? ");
    		int n1 = kb.nextInt();
    		System.out.print("a/b...b? ");
    		int n2 = kb.nextInt();
    		System.out.printf("%d / %d = %d \n", n1, n2, n1/n2);
    		System.out.println("Good bye~~!");
    	}
    }

    예외 클래스 : 예외 상황을 알리기 위해 만들어진 클래스

    java.lang.ArithmeticException

    ->수학 연산에서의 오류 상황을 의미하는 예외 클래스 

    java.util.InputMismatchException

    ->클래스 scanner를 통한 값의 입력에서의 오류 상황을 의미하는 예외 클래스

     

    try ~ catch

    예외의 처리를 위한 코드를 별도로 구분하기 위해 디자인 된 예외처리 메커니즘

    try{

       ...관찰 영역...

    }

    catch(ArithmericException e){

        ...처리 영역...

    }

    try 영역에서 발생한 예외 상황을 catch 영역에서 처리한다.

    import java.util.Scanner;
    
    class ExceptionCase2{
    	public static void main(String[] args){	
    		Scanner kb = new Scanner(System.in);
    	         	try{
    			System.out.print("a/b...a? ");
    			int n1 = kb.nextInt();
    			System.out.print("a/b...b? ");
    			int n2 = kb.nextInt();
    			System.out.printf("%d / %d = %d \n", n1, n2, n1/n2);
    		}
    		catch(ArithmeticException e){
    			System.out.println(e.getMessage());
    		}
    		System.out.println("Good bye~~!");
    	}
    }

    import java.util.Scanner;
    import java.util.InputMismatchException;
    
    class ExceptionCase4{
    	public static void main(String[] args){	
    		Scanner kb = new Scanner(System.in);
    	         	try{
    			System.out.print("a/b...a? ");
    			int n1 = kb.nextInt();
    			System.out.print("a/b...b? ");
    			int n2 = kb.nextInt();
    			System.out.printf("%d / %d = %d \n", n1, n2, n1/n2);
    		}
    		catch(ArithmeticException e){
    			System.out.println(e.getMessage());
    		}
    		catch(InputMismatchException e){
    			System.out.println(e.getMessage());
    		}
    		System.out.println("Good bye~~!");
    	}
    }

    import java.util.Scanner;
    import java.util.InputMismatchException;
    
    class ExceptionCase5{
    	public static void main(String[] args){	
    		Scanner kb = new Scanner(System.in);
    	         	try{
    			System.out.print("a/b...a? ");
    			int n1 = kb.nextInt();
    			System.out.print("a/b...b? ");
    			int n2 = kb.nextInt();
    			System.out.printf("%d / %d = %d \n", n1, n2, n1/n2);
    		}
    		catch(ArithmeticException | InputMismatchException  e){
    			System.out.println(e.getMessage());
    		}
    		System.out.println("Good bye~~!");
    	}
    }

    Throwable 클래스

    java.lang.Throwable 클래스 : 모든 예외 클래스의 최상위 클래스 

     

    public String getMessage() -> 예외의 원인을 담고 있느 문자열을 반환

    public void printStackTrace() -> 예외가 발생한 위치와 호출된 메소드의 정보를 출력

     

    class ExceptionMessage2 { 
        public static void md1(int n) {
            md2(n, 0);
        }
        public static void md2(int n1, int n2) {
            int r = n1 / n2;
        }
        public static void main(String[] args) {
            try {
                md1(3);
            }
            catch(Throwable e) {
                e.printStackTrace();
            }
            
            System.out.println("Good bye~~!");
        }
    }

    class ArrayIndexOutOfBounds { 
        public static void main(String[] args) {
            int[] arr = {1, 2, 3};    
            for(int i = 0; i < 4; i++)
                System.out.println(arr[i]);
    
        }
    }

    class Board { }
    class PBoard extends Board { }
    
    class ClassCast { 
        public static void main(String[] args) {
             Board pbd1 = new PBoard();
             PBoard pbd2 = (PBoard)pbd1;    // OK!
        
             System.out.println(".. intermediate location .. ");
             Board ebd1 = new Board();
             PBoard ebd2 = (PBoard)ebd1;    // Exception!
        }
    }

    class NullPointer { 
        public static void main(String[] args) {
            String str = null;
            System.out.println(str);    // null 출력
            int len = str.length();    // Exception! 
        }
    }

    예외 클래스의 구분

    Error 클래스를 상속하는 예외 클래스

    Exception 클래스를 상속하는 예외 클래스

    RuntimeException 클래스를 상속하는 예외 클래스

     

    Error 클래스  /  만들어졌을때 코드레벨의 오류가 아님

    VirtualMachineError 가상 머신에 심각한 오류

    IOError 입출력 관련해서 코드 수준 복구가 불가능한 오류 발생

     

    RuntimeException 클래스 / 에러같지만 예외인 애매한 클래스

    ArithmeticException

    ClassCastException

    IndexOutOfBoundException

     

    Exception 클래스를 상속하는 예외 클래스

    IOException

    throws IOException 을 통해 해당 구문에서 발생한 오류를 던져버리겠다 나를 부른 아이에게!

     

    직접 정의하는 예외

    논리적인 예외일 경우 

    class ReadAgeException extends Exception{	
    	public ReadAgeException(){
        	super("유효하지 않은 나이가 입력되었습니다.");
        }	//Throwable 클래스의 getMessage  메소드가 반환할 문자열 지정
    }
    import java.util.Scanner;
    
    class ReadAgeException extends Exception {
        public ReadAgeException() {
            super("유효하지 않은 나이가 입력되었습니다.");
        }
    }
    
    class MyExceptionClass {
        public static void main(String[] args) {
            System.out.print("나이 입력: ");
        
            try {
                int age = readAge();
                System.out.printf("입력된 나이: %d \n", age);
            }
            catch(ReadAgeException e) {
                System.out.println(e.getMessage());
            }
        }
        
        public static int readAge() throws ReadAgeException {
            Scanner kb = new Scanner(System.in);
            int age = kb.nextInt();
            
            if(age < 0)
                throw new ReadAgeException();
    
            return age;
        }
    }

     if(age < 0)
                throw new ReadAgeException();   

    직접 예외의 상황을 설정함

     

    finally 구문

    마지막에 담기 위한 구문

    try{...

    }

    finally{...

    }

    또는

    try{...

    }

    catch(Exception name){...

    }

    finally{...

    }

     

    try-with-resources

    try 구문을 빠져 나갈 때, 다음 문장을 안정적으로 자동 실행 

    writer.close();

    댓글

Designed by Tistory.