자바-자린이의 도전기

예외처리 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