자바-자린이의 도전기
예외처리 Exception 1-1) RuntimeException
광형
2022. 5. 8. 10:00
728x90
728x90
SMALL
에러(오류)의 종류
-시스템 에러 : 컴퓨터의 오작동으로 인해 발생하는 에러
->소스코드로 해결이 안됩니다.(심각한 에러)
-컴파일 에러 : 프로그램 실행 전 소스코드상의 문법적인 문제로 발생하는 에러
->소스코드 수정으로 해결(빨간줄로 오류)
-런타임 에러 : 프로그램 실행 중 발생하는 에러
-소스코드상의 문제가 없는데도 발생(사용자의 잘못 또는 개발자가 경우의 수 처리를
안 해놓는 경우)
-논리 에러 : 소스코드상의 문법적인 오류도 없고 실행했을 때도 문제가 되진 않지만
프로그램의 의도상 맞지 않는 것입니다.(기획과 설계가 잘못된 경우)
예외 : 시스템 에러를 제외한 나머지 컴파일, 논리 에러와 같은 비교적 덜 심각한 에러들
특히나 런타임 에러를 주로 예외로 다루고 있습니다.
예외 처리 : 예외들이 발생했을 경우를 대비해서 처리하는 방법을 정의해두는 것입니다.
예외 처리 이유 : 예외 발생시 프로그램이 비정상적으로 종료되는것을 막기 위해서 입니다.
방법
1. try ~ catch 문을 이용합니다.
2. throws 로 예외 던지기 (미루기) ->오류가 발생한 메소드에 예외를 그 메소드를 호출한 곳으로 넘깁니다.
마지막까지 넘기면 main에서 처리해줘야합니다.
예외 종류
RuntimeException
프로그램 실행시 발생되는 예외
RuntimeException의 자식 클래스들
-ArrayIndexOutOfBoundsException : 배열의 부적절한 인덱스로 접근할때 발생하는 예외
-ClassCastException : 허용할 수 없는 형변환이 진행될 경우 발생하는 예외
-NullPointerException : 참조하는곳이 없을경우 null임에도 접근하려고 할때 발생하는 예외
-ArithmeticException : 0으로 나누려고 할때 발생하는 예외
이러한 RuntimeException과 관련된 예외는 충분히 예측 가능한 상황이기 때문에
예외 자체가 발생이 안되게 조건문으로도 처리 가능합니다.
굳이 예외처리까진 필요없습니다.
RuntimeException 관련 예외
-조건문으로 해결가능 : 예외 자체가 발생 안되게 개발자가 소스코드로 핸들링 하는것입니다. (예외처리X)
-예외처리구문으로 해결가능 : 예외가 발생했을 때 어떤 처리할것인지 정의해두는것입니다.
-예측 가능한 상황 : 조건문으로 해결(더 권장)
-예측이 불가능한 상황 : 예외처리구문으로 해결
RuntimeException 계열은 조건문으로 처리할 수 있다면 그 방식을 더 권장합니다.
->예외처리가 필수가 아닙니다."UncheckedException"
다중 catch블럭
작은 범위에서 큰 범위로 catch해야 하는 이유는
위에서 부모클래스의 exception으로 다 처리해버리면 아래있는 자식 클래스타입엔 기회가 없기 때문
세세하게 오류에 대한 처리를 하고 싶다면 위에서부터 작은 범위로 작성
한개의 catch구문을 실행하면 나머지는 뛰어넘고 try catch구문을 빠져나오게 된다.
//ArithmeticException
public void method1() {
//사용자에게 두개의 정수값을 입력받아 나눗셈 결과 출력
Scanner sc = new Scanner(System.in);
System.out.println("첫번째 정수 : ");
int num1 = sc.nextInt();
System.out.println("두번째 정수 : ");
int num2 = sc.nextInt();
방법 1. 조건문으로 처리(애초에 예외가 발생하지 않게 처리)
if(num2!=0) {
System.out.println("나눗셈 결과 : "+(num1/num2));
}else {
System.out.println("0으로는 나눌 수 없습니다.");
}
System.out.println("프로그램 종료");
방법 2. 예외 처리 구문을 사용해서 해결해봅시다.
예외가 발생했을 경우에 실행할 내용을 정의하기.
try ~ catch구문
[표현법]
try{
예외가 발생할것 같은 구문
}catch(발생할 예외클래스명 클래스변수명){
해당 예외가 발생했을때 실행할 구문.
}
try {
System.out.println("나눗셈 결과 : "+(num1/num2));
//ArithmeticException이 발생하면?
}catch(ArithmeticException e) {
System.out.println("0으로 나눌 수 없습니다.");
e.printStackTrace();//예외가 어디에서 발생했는지 파악할 수있게 메세지를 남긴다.
//현재 오류가 어디서 발생했는지,경로도 다 알려준다.
//개발단계에서만 사용해야함 why? 사용자에게 보여주면 놀람(문제가 생겼다는걸 알게되기 때문)
}
System.out.println("프로그램 종료");
}
다중 catch 블록
catch할 예외가 여러개일 경우 사용
예외 나열 순서 : 범위가 작은 자식타입의 예외클래스부터 나열
Scanner sc = new Scanner(System.in);
System.out.println("정수 입력(0제외) : ");
try {
int num = sc.nextInt(); //num에 정수형이 아닌 타입이 들어오면 InputMismatchException발생
System.out.println("나눗셈 결과 : "+(20/num)); //num이 0이면 ArithmeticException발생
}
catch(ArithmeticException e ) {
System.out.println("0으로는 나눌 수 없어요...");
// e.printStackTrace();
}
catch(InputMismatchException e) {
System.out.println("정수로 입력해주세요!!!!!제발!!");
// e.printStackTrace(); 오류 추적
System.out.println("프로그램 종료");
}
}
728x90
300x250
LIST