본문 바로가기

언어/Java

예외(Exception)

사용자가 겪을 수 있는 오류 2 유형

▷ 컴파일 오류 : 오타, 자료형불일치, 상속관계 불일치
 실행오류
     - 에러(치명적인 오류) : 개발자가 해결할 수 없는 오류 ex) 메모리가 부족해서 나오는 오류
     - 예외(경미한 오류) : 개발자가 해결할 수 있는 오류 또는 처리할 수 있는 오류
                                       예외는 해결or처리 안해도 되는데, 안하면 프로그램이 죽어버림 이게 문제

※ 예외종류

                                                java.lang.Throwable
                                                               :
                                               java.lang.Exception
                :                              :                             :                                 :
RuntimeException         IOException         SQLException         SocketException

 RuntimeException의 종류

     RuntimeException은 uncheckedException이라고도 부른다.
     NullPointerException, ArithmeticException, ArrayIndexOutOfBoundsException, NumberFormatException, ClassCastException 등
     : IOException, SQLException, SocketException 이것들은 compile할때 감지되는데(컴파일오류)

        RuntimeException는 컴파일러가 감지를 못해서 일단 프로그램 실행하고 정지됨

ExceptionTest.java

 예외처리방법
   - try~catch~finally
   - throws

▷ finally 생략 가능, 예외발생 유무와 관계없이 처리해야하는 구문, 주로 외부자원과 닫는 구문
예외가 발생안하면 try 구문 끝까지 진행하고 finally
예외가 발생하면 그 즉시 catch로 이동하고 finally
catch 없이 try~finally도 사용 가능 

 

- 모양
try {
    //예외발생가능코드
} catch(발생가능한 예외종류 e) {

} finally {

}

try {
	//NullPointerException 발생가능코드
	//ArithmeticException 발생가능코드
} catch(NullPointerException e) {
	System.out.println("문제발생!");
} catch(ArithmeticException e) {
	System.out.println("문제발생!");
}

// 위의 코드 아래처럼 수정 가능
try {
	//NullPointerException 발생가능코드
	//ArithmeticException 발생가능코드
} catch(NullPointerException | ArithmeticException e) {
	System.out.println("문제발생!");
}
import java.util.Scanner;

public class ExceptionTest {
	public static void m(int num) {
		System.out.println("99를 " + num + "로 나눈 나머지값은 " + (99%num));
    }
    
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int num = sc.nextInt();
		m(num);
	}
 }

결과 1
결과 2
m 메서드에서 try catch 가능, 떠넘겨서도 가능
printStackTrace(); 디버깅용도로만 사용하기. 예외 종류 내용 줄번호 알려줌
getMessage();

 

ProductUser.java, 저장소 꽉 찼습니다 Exception 처리
excption용 class만들기. Superclass-Browse
ProductUser.java에서 import 해서 사용

 

왼쪽은 정상처리 오른쪽은 익셉션 순서
순서
저장소가 꽉찼습니다. 예외처리로 처리하기

import java.util.InputMismatchException;
import java.util.Scanner;

public class ExceptionTest {
	public static void m(Object obj) {
		try {
			String str = obj.toString();	
			System.out.println("객체정보: "+ str);
		} catch(NullPointerException e) {
			System.out.println(e.getMessage());
		} finally {
			System.out.println("finally");
		}
	}
	
	public static void m(int num) {
//		System.out.println("99를 " + num + "로 나눈 나머지값은 " + (99%num)); 밑에  try catch 보낼 때

		try {
			System.out.println("99를 " + num + "로 나눈 나머지값은 " + (99%num));
		} catch(ArithmeticException e) {
			String msg = e.getMessage(); //예외 메시지만 받을 수 있다. 
			System.out.println(msg);
			System.out.println("0은 입력하셨습니다");
		}

		
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("0이 아닌 숫자값을 입력하세요:");
		int num;
		try {
			num = sc.nextInt();
		} catch(InputMismatchException e) {
			e.printStackTrace(); 
//			System.out.println("숫자값을 입력하세요");
			System.out.println("숫자값을 입력하지 않았습니다. 1로 자동설정합니다");
			num = 1;
		} 	
				
		/*
		try {
			m(num);
		} catch(ArithmeticException e) {
			System.out.println("0은 입력하면 안됩니다");
		}
		*/
		
		/*
		// 모든 예외를 막을 수 없음. 예외가 발생하도록 놔두고 사후 예외처리를 함
		if(num == 0) { //예외가 아예 발생하지 않도록 피해가는 작업
			System.out.println("0은 입력하면 안됩니다");
			return;
		}
		*/
		
		m(num);
		
		Object o;
		o = new Object();
		m(o);
		
		o = null;
		m(o);
	}
}

결과 1
결과 2
결과 3

※ Exception 처리 순서
자식→부모 순으로 해야함. 순서 바뀌면 안된다.

try {
	//FileNotFoundException(자식) 발생가능코드
	//IOException(부모) 발생가능코드
} catch(FileNotFoundException e) {
	System.out.println("문제발생!");
} catch(IOException e) {
	System.out.println("문제발생!");
} 

public int m( Object o ){
	try {
		System.out.println(o.toString());
		return 1;
	} catch(NullPointerException e) {
		return 0;
	} finally {
		System.out.println("finally!");
	}
}

▷ throws
throws : 메소드 호출한 곳으로 예외 떠넘기기

public void someMethod() throws IOException {
    // 예외 발생 가능성이 있는 코드
}


try-catch : 메소드 내에서 예외 해결, try-catch는 예외가 발생할 수 있는 코드를 감싸는 블록, 예외를 직접 처리하는 용도

                 try 블록 안에서 예외가 발생하면, 해당 예외와 일치하는 catch 블록이 실행. catch 블록은 예외를 처리하는

                 코드를 포함.

try {
    // 예외 발생 가능성이 있는 코드
} catch (IOException e) {
    // 예외 처리 코드
}

 

throw : 강제예외 발생 ( throws와 다르다) 

public void someMethod(int value) {
    if (value < 0) {
        throw new IllegalArgumentException("value cannot be negative");
    }
    // 나머지 코드
}

'언어 > Java' 카테고리의 다른 글

NaN과 Infinity  (0) 2023.08.04
오버플로우와 언더플로우  (0) 2023.08.04
복제(shallow copy, deep copy)  (0) 2023.08.02
리플렉션(Reflection)  (0) 2023.08.02
GUI프로그램  (0) 2023.08.02