본문 바로가기

카테고리 없음

자바 try catch 그리고 나머

try catch 문은 프로그래밍을 하다가 코드에서 오류나 발생 할 것 같은 예외상황을 경우를 미리 예상을 하고 만들어 놓는 것이다.

try catch 문은 문제 상황에 대한 정의 및 구분을 할 줄알아야한다.

문제상황의 구분은 회복 가능 여부를 판단 해야한다.

오류 : 회복이 불가능한 문제

예외 : 일반적으로 회복이 가능한 문제

 

예외 처리 전 컴파일 에러와 런타임 에러의 개념

컴파일 에러

자바 파일을 class 파일로 컴파일할 때 발생

런타임 에러

프로그램 실행도중에 맞닥뜨리게 되는 예외

 

예외의 종류

확인된 예외 - 컴파일 시점에 확인한다.

확인된 예외

 

 

미확인된 예외

런타임 시점에 확인되는 예외

예외 처리가 반드시 필요하지 않은 예외

예외 발생과 try-catch, finally 문

throw throws 차이

 

우리가 메서드를 선언 할 때, 이 메서드가 위험하다는것을 미리 예측해야 합니다.

그리고 예측이 되어 있다면, 실제로 throw 키워드와 함께 이 메서드가 위험하다고 알려야 합니다.

try catch를 사용하는 이유

 

 

public class StudyException {
	public static void main(String[] args) {
        OurClass ourClass = new OurClass();
        try {
        // 1. 위험한 메소드의 실행을 "시도" 해 봅니다.
        // "시도" 해보는 코드가 들어가는 블럭입니다.
        ourClass.thisMethodIsDangerous();
        } catch (OurException e) {
        // 2. 예외가 발생하면, "잡아서" handling 합니다.
        // 예외가 발생하는경우 "handling" 하는 코드가 들어가는 블럭입니다.
        // 즉 try 블럭 내의 구문을 실행하다가 예외가 발생하면
        // 예외가 발생한 줄에서 바로 코드 실행을 멈추고
        // 여기 있는 catch 블럭 내의 코드가 실행됩니다.
        System.out.println(e.getMessage());
        } finally {
        // 3. 예외의 발생 여부와 상관없이, 실행시켜야 하는 코드가 들어갑니다.
        // 무조건 실행되는 코드가 들어가는 블럭입니다.
        System.out.println("우리는 방금 예외를 handling 했습니다!");
        }
	}
}

 

 

 

자식을 먼저 처리를 해주고 부모를 처리 해야지 순서대로

처리가 됨

이처럼 범위가 더 좁은 예외를 처리하는 catch 블록을 먼저 명시하고, 범위가 더 넓은 예외를 처리하는 catch 블록은 나중에 명시해야만 정상적으로 해당 예외를 처리할 수 있습니다.

 

1. try 문 : 예외가 발생할 가능성이 있는 코드 블록
2. throw 문 : try 문에서 발생한 오류에 대한 정보를 전달
3. catch 절 : 발생한 예외에 대해 예외 핸들러가 처리할 내용을 담은 코드 블록
try {
    예외를 처리하길 원하는 실행 코드;
} catch (e1) {
    e1 예외가 발생할 경우에 실행될 코드;
} catch (e2) {
    e2 예외가 발생할 경우에 실행될 코드;
}
...
finally {
    예외 발생 여부와 상관없이 무조건 실행될 코드;
}

public class Exception01 {
    public static void main(String[] args) {
        byte[] list = {'a', 'b', 'c'};
        System.out.write(list);
    }
}
write 함수에 대한 예외를 처리하지 않아서 오류가 남
byte[] list = {'a', 'b', 'c'};
 
try {
    System.out.write(list); a b c 출력
} catch (IOException e) {
    e.printStackTrace();
}

try {
    System.out.write(list);
} catch (IOException e) {
    e.printStackTrace(); // 자식 클래스 ioexception
} catch (Exception e) {
    e.printStackTrace(); // io의 부모 exception
}

 

 

 

 

 

throw 오류 확인 할 수 있는 메소드

 

 

 

 

제네릭

제네릭 예제
public class Generic {
// 2.
private T t;
// 3.
public T get() {
	return this.t;

}
public void set(T t) {
	this.t = t;
}
public static void main(String[] args) {
    // 4.
    Generic stringGeneric = new Generic<>();
    // 5.
    stringGeneric.set("Hello World");
    String tValueTurnOutWithString = stringGeneric.get();
    System.out.println(tValueTurnOutWithString);
}
}

 

 

타입을 유연하게 다루는 generic

c++을 통해서 객체지향을 공부를 했던 사람이라면 템플릿이 기억이 날 것이다.

제네릭은 템플릿과 아주 유사하다. <타입>이 들어간다. 템플릿을 통해서 우리가 어떤 자료형을

미리 넣을지는 모르니 <>하고 안에 우리가 원하는 타입을 선언을 할 수 있게 해준다.

제네릭의 장점

중복되거나 필요없는 코드를 줄여주는 것

타입 안정성을 해치지 않는 것

제네릭은 c++의 템플릿과 비슷함