220928 정리(예외처리)

서이·2022년 9월 28일

수업정리

목록 보기
6/17

 자바에서는 에러와 예외(Exception)이라고 부르는 오류가 있다.

 에러는 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램 실행 오류가 발생하는 것으로 JVM실행에 문제가 생겨서 결국 실행 불능이 된다.

 예외란 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류를 말한다. 예외가 발생되면 프로그램은 곧바로 종료된다는 점에서는 에러와 동일하다. 그러나 예외는 예외처리(Exception Handling)를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있다.

 예외에는 2가지로 나눌 수 있습니다.

  • 일반 예외(exception)
  • 실행 예외(runtime exception)

 일반 예외와 실행 예외 클래스는 RuntimeException 클래스를 기준으로 구별합니다. RuntimException의 하위 클래스가 아니면 일반 예외 클래스이고, 하위 클래스이면 실행 예외 클래스입니다.

 컴파일러가 에러처리를 확인하지 않는 RuntimeException 클래스들은 unchecked 예외라고 부르고 예외처리를 확인하는 Exception 클래스들은 checked 예외라고 부릅니다.


👉일반예외
체크 예외(Checked Exception)

 체크 예외의 특징은 반드시 에러 처리를 해야하는 특징(try/catch or throw)을 가지고 있습니다.

-존재하지 않는 파일의 이름을 입력(FileNotFoundException)
-실수로 클래스의 이름을 잘못 적음(ClassNotFoundException)

체크 예외의 예시는 이러한 것들이 있습니다.



👉실행 예외
언체크 예외(Unchecked Exception)

체크 예외와는 달리 에러 처리를 강제하지 않습니다.
말 그대로 실행 중에(runtime) 발생할 수 있는 예외를 의미합니다.

-배열의 범위를 벗어난(ArrayIndexOutOfBoundsException)
-값이 null이 참조변수를 참조(NullPointerException)

(RuntimeException은 개발자들에 의해 실수로 발생하는 것들이기 때문에 에러를 강제하지 않는 것입니다.)

  1. try 블록에는 예외 발생 가능 코드가 위치

  2. try 블록의 코드가 예외 없이 정상 실행되면 catch 블록의 코드는 실행되지 않고 finally 블록의 코드를 실행, 만약 try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행하고 finally 블록의 코드를 실행

  3. finally 블록은 생략 가능, 예외 발생 여부와 상관없이 항상 실행할 내용이 있을 경우에만 finally 블록 작성해주면 된다.




    다중 catch

public class ExceptionCase3 {

	public static void main(String[] args) {
  
  //에러문구를 보여주는 주체는 JVM이다
		Scanner kb = new Scanner(System.in);
		
		try {
			System.out.println("a/b......a? ");
			int n1 = kb.nextInt();
		
			System.out.println("a/b.......b? ");
			int n2 = kb.nextInt();
		
			System.out.printf("%d / %d = %d \n", n1,n2, n1/n2);
		
		}catch (ArithmeticException e) {
				e.printStackTrace();
				System.out.println(e.getMessage());
		}catch (InputMismatchException e) {
				e.printStackTrace();
				System.out.println(e.getMessage());
		}catch(Exception e) { 
  //Exception객체임, 객체생성은 JVM이 해줌.
 
  // (예외처리는 위에서 아래로)Exception은 상위 예외 클래스이기때문 하위 클래스
  // 보다 아래 쪽에 위치해야한다. 만약 상위 예외 클래스의 catch 블록이 위에 있다면
  // 하위 예외 클래스의 catch블록은 실행 되지않으며 빨간 줄이 뜬다.
  // 왜냐하면 하위 예외는 상위 예외를 상속 했기 때문에 상위 예외 타입도 되기때문이다.
  			e.printStackTrace(); 
  //해당문구에러 뿌려줌. 디버깅을위해 기본적으로 넣어줌(에러체크하기위해)
			System.out.println(e.getMessage());
		}
		
		finally {
			System.out.println("무조건 실행");
	}
			System.out.println("Good bye~~!");
}

}

catch 블록이 여러 개라 할지라도 단 하나의 catch 블록만 실행된다. 그 이유는 try 블록에서 동시 다발적으로 예외가 발생하지 않고, 하나의 예외가 발생하면 즉시 실행을 멈추고 해당 catch 블록으로 이동하기 때문이다.



💡e.getMessage() : 에러의 원인을 간단하게 출력한다.

💡e.printStackTrace() : 에러의 발생근원지를 찾아서 단계별로 에러를 출력한다.


//throws => 예외처리를 호출한 함수한테 맡긴다는 뜻
// JVM한테 IOException 을 던지겠다(내가 처리 안하고) = 에러 처리 안하겠다.
public class Test2 {

	public static void main(String[] args) throws IOException {
		byte[] byteArr = { 'a' , 'b' , 'c' };
			
			
//			System.out.write(byteArr);

//결국 throws 키워드는 JVM에게 예외처리를 맡긴다는 것
//JVM이 에러처리를 한다는 건 JVM이 에러 메시지를 띄우고 프로그램을 종료하는 것
		
profile
작성자 개인이 잊을 때마다 보라고 정리한 글

0개의 댓글