JAVA - 예외처리

프로그램 오류 

프로그램 수행 시 치명적 상황이 발생하여 비정상 종료 상황이 발생한것, 이것을 프로그램 오류

 

프로그램 오류의 종류

1. 컴파일 에러 - 프로그램의 실행을 막는 소스 상의 문법에러, 소스 구문을 수정하여 해결(대부분 오타)

2. 런타임 에러 - 입력 값이 틀렸거나, 배열의 인덱스 범위를 벗어났거나, 계산식의 오류 등 주로 if문으로 에러 처리

3. 시스템 에러 - 컴퓨터 오작동으로 인한 에러, 소스 구문으로 해결 불가

 

 

Checked, Unchecked

Chekced Exception

반드시 예외 처리를 진행해야함 (필수사항)

 

Unchecked Exception

예외처리 선택사항 안해도 상관없음

 

RuntimeException 

프로그램 실행 시 발생 되는 예외들

UncheckedException이므로 반드시 예외처리 구문을 작성할 필요는 없고,

코드 개선을 통해 처리가능,

 

예외종류

1.ArraysIndexOutOfBoundsException

배열의 접근에 잘못 된 인덱스 값을 사용하는 예외

int[] arr = new int[5];

배열의 인덱스는 0, 1, 2 ,3, 4 << 총 5개의 공간인데

arr[5] = 10; 이런식으로 작성식 

배열접근을 잘못하여 에러발생

 

2. NullPointerException

참조 변수가 null로 초기화 된 상태에서 메소드를 호출하는 예외

String str = null;

int size = str.length(); 

이렇게 호출 String 이 null값인데 입력된 값의 수를 확인할때 에러발생

 

 

3. ClassCastException

허용할 수 없는 형변환이 진행되는 예외

String str = "1";

Object obj = str;

Integer integer = (Integer)obj;

 

 

4. ArithmeticException

나누기 연산할때 0으로 나누었을때 발생하는 예외

System.out.println(0/4);

이런식으로 0으로 나누었을대 발생하는 에러

 

예외(try-catch) 작성방법

try{

 예외가 발생될만한 코드

} catch(발생될 예외 작성 매개변수){

 예외발생시 실행할코드

}

 

Scanner sc = new Scanner(System.in);
System.out.print("숫자 하나 입력 : ");
try {
int num = sc.nextInt();
int result = 10 / num;
System.out.println("result : " + result);
}catch(ArithmeticException e) {
System.out.println("0 입력 불가!");
}catch(InputMismatchException e) {
System.out.println("문자 입력 불가");
}catch(RuntimeException e) {
System.out.println("모든 RuntimeException을 받아주마!");
}catch(Exception e) {
System.out.println("모든 Exception을 받아주마!");
}

 

catch 블럭은 여러개 사용가능함

result에서 10 / 0 이되는상황이면 첫 catch블럭의 0입력 불가! 실행후 try-catch 빠져나옴

 

 

 

CheckedException 은 대부분 입출력 클래스 사용할때 발생하게된다.

 

 

사용자 정의 예외 

꼭 지정된 예외가 아니더라도 개발자가 예외를 생성할수있다.

 

 

UserException.class

// 1. Exception 상속
// 2. 기본생성자, 매개변수 생성자 1개씩 생성
public class UserException extends Exception{
	public UserException(){}
    public UserException(String str){
    	super(str); // 여기에 예외발생될때마다 메세지 개발자가 입력할수있음
    }

}

UserExceptionTest.class

public class UserExceptionTest{

	// 소문자만 입력 받고 소문자가 아닌 입력이 있을 경우 UserException을 발생 시키는 프로그램
	public void method1 () throws UserException {
		Scanner sc  = new Scanner(System.in);
		System.out.print("영문 입력(반드시 소문자만) : ");
		String input = sc.nextLine();
		
		for(int i = 0; i < input.length(); i++) {
			if(input.charAt(i) < 'a' || input.charAt(i) > 'z') {
				// throw : 오류 발생 시키
				throw new UserException(input.charAt(i) + "는 소문자가 아닙니다.");
			}
			
		}
		
		System.out.println("입력 된 문자 : " + input);
		
	}
}

 

만약 입력된 영문자중 대문자가 들어오면 throw 구문이용하여 아까생성한 예외 발생처리

 

 

 

throw

코드를 작성하다보면 예외를 발생해야할 때가있을것이다.

그럴때마다 개발자가 임의로 예외를 발생시킬수있다.

throw new 예외이름(); <<이런식으로 작성하면 강제 예외발생

 

throws

class 옆에적어주는 구문으로

예외가 발생할수있다. 대신 내가처리안하고 나를 호출한 곳으로 예외를 던지겠다.

라는뜻이다.

'프로그래밍 > JAVA' 카테고리의 다른 글

JAVA - I.O(입출력) > 보조 스트림  (0) 2021.06.04
JAVA - I.O(입출력) > 기반 스트림  (2) 2021.06.03
JAVA - DATE, Calendar,  (0) 2021.06.02
JAVA - String 클래스  (0) 2021.05.31
JAVA - 객체(toString(), equals(), hashCode())  (0) 2021.05.27
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유