Day 34 (23.02.13)

Jane·2023년 2월 13일
0

IT 수업 정리

목록 보기
38/124

1. 예외 처리

1-1. 컴파일 에러가 잡지 못하는 실시간 에러

  • 프로그램이 돌아가는 도중 문제가 생기면 // 프로그램을 중단하고 // 에러가 생긴 Call Stack을 전부 보여준다.
  • JVM이 예외 처리 자체를 class로 표현해준다.

1-2. 예외 처리가 발생하는 상황 예시

import java.util.Scanner;

class JavaTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.println("1번째 수 >> ");
		int n1 = sc.nextInt();
		System.out.println("2번째 수 >> ");
		int n2 = sc.nextInt();
		
		System.out.println(n1 / n2);
	}

}
  • 나누기를 할 때, 수는 0으로 나눌 수 없다.

  • Int를 입력해야 하는데 다른 자료형을 입력받은 경우

1-3. 예외 처리하기

  • 구조 : try ~ catch ~ finally
import java.util.Scanner;

class JavaTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		try {
			System.out.println("1번째 수 >> ");
			int n1 = sc.nextInt();
			System.out.println("2번째 수 >> ");
			int n2 = sc.nextInt();

			System.out.println(n1 / n2);
		}

		catch (Exception e) {
			e.printStackTrace();
		}

	}

}

import java.util.Scanner;

class JavaTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		try {
			System.out.println("1번째 수 >> ");
			int n1 = sc.nextInt();
			System.out.println("2번째 수 >> ");
			int n2 = sc.nextInt();

			System.out.println(n1 / n2);
		}

		catch (Exception e) {
			System.out.println(e.getMessage());
		}

	}

}

  • finally : 에러의 여부와 관계없이 무조건 실행되어야 하는 것
import java.util.Scanner;

class JavaTest {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		try {
			System.out.println("1번째 수 >> ");
			int n1 = sc.nextInt();
			System.out.println("2번째 수 >> ");
			int n2 = sc.nextInt();

			System.out.println(n1 / n2);
		}

		catch (Exception e) {
			e.printStackTrace();
		}finally {
			System.out.println("Finally...");
		}

	}

}

[Console]
1번째 수 >>
10
2번째 수 >>
0
java.lang.ArithmeticException: / by zero
Finally...
at JavaTest.main(JavaTest.java:14)

1-4. 예외 처리할 때 주의할 점

import java.util.InputMismatchException;

class JavaPractice {

	public static void main(String[] args) {
		try {
			int num = 6 / 0;
		} catch (InputMismatchException e) {
			e.printStackTrace();
		}
	}
}

[Console]
Exception in thread "main" java.lang.ArithmeticException: / by zero
at JavaPractice.main(JavaPractice.java:7)

  • 일부 예외처리만 catch하려고 할 경우, 다른 예외처리는 잡지 못하게 된다.
  • 다형성을 적용하여 Exception으로 catch하면 모든 예외처리를 손쉽게 잡을 수 있다.

1-5. 둘 이상의 try~catch 표현

import java.util.InputMismatchException;

/* 표현법 1 */

catch (ArithmeticException e) {
			e.printStackTrace();
}
		
catch (InputMismatchException e) {
			e.printStackTrace();
}

/* 표현법 2 */
catch (ArithmeticException | InputMismatchException e) {
			e.printStackTrace();
}

2. 예외 처리의 예시

  • ArithmeticException
    0으로 나눌 수 없는 연산을 진행하려 할 때 발생되는 Exception
  • InputMismatchException
    입력받는 자료형이 맞지 않을 때 발생되는 Exception
  • ArrayIndexOutOfBoundsException
    인덱스가 범위에 없을 경우에 발생되는 Exception
public static void main(String[] args) {
	int[] arr = { 0, 1, 2 };
	for (int i = 0; i <= 3; i++) {
		System.out.println(arr[i]);
	}
}

[Console]
0
1
2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
at JavaTest.main(JavaTest.java:9)

  • ClassCastException
    부모-자식 간의 상속 관계의 형 변환에서 발생되는 Exception
class A {}

class B extends A{}


class JavaTest {

	public static void main(String[] args) {
		A a1 = new B();
		B a2 = (B)a1; // 정상적으로 casting 된다
		
		System.out.println("Test");
		
		A aa = new A();
		B bb = (B)aa; // Exception 발생
	}

}

[Console]
Test
Exception in thread "main" java.lang.ClassCastException: class A cannot be cast to class B (A and B are in unnamed module of loader 'app')
at JavaTest.main(JavaTest.java:15)

  • NullPointerException
    null 자체는 객체에 아무 것도 없는 상태에서 return 자체는 가능하지만, (String.valueOf())
    toString()으로 출력하거나 리턴할 수 없어서 생기는 Exception
public static void main(String[] args) {
	String str = null;
	System.out.println(str);
	int len = str.length();
}

[Console]
null
Exception in thread "main" java.lang.NullPointerException
at JavaTest.main(JavaTest.java:9)

3. printStackTrace가 실행되는 방식


public class ExceptionMessage {

	public static void md1(int n) {
		md2(n,0);
	}

	public static void md2(int n1, int n2) {
		int r = n1 / n2;
	}
	
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		md1(3);
		System.out.println("Test...");
	}

}


  • ArithmeticException이 일어났다!
    • (3) md2 함수에서 3 / 0 을 하려고 해서 오류
    • (2) md1 함수에서 md2(3,0) 오류
    • (1) main 함수 안의 md1(3)에서 오류
  • printStackTrace는 스택 형식으로 출력된다. 나의 동작이 밑에서부터 쌓인다.

4. Object를 상속한 class 예제


class Circle extends Object{
	private int radius;
	
	Circle(int radius){
		this.radius = radius;
	}
	
	public double getArea(){
		return Math.PI * radius * radius;
	}
	
    @Override
	public String toString() {
		return ("넓이는 " + getArea() + "입니다.");
	}
}


class JavaTest {

	public static void main(String[] args) {
		Object obj = new Circle(10);
		System.out.println(obj);
	}

}

[Console]
넓이는 314.1592653589793입니다.

5. final의 활용

  • 변수가 final : 상수
  • 함수가 final : 오버라이딩을 할 수 없음
  • 클래스가 final : 하위 클래스가 상속을 받을 수 없음
profile
velog, GitHub, Notion 등에 작업물을 정리하고 있습니다.

0개의 댓글