728x90

Obj. 자바의 예외에 대해 학습.

Todo.

9-1. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

9-2. 자바가 제공하는 예외 계층 구조

9-3. Exception과 Error의 차이는?

9-4. RuntimeException과 RE가 아닌 것의 차이는?

9-5. 커스텀한 예외 만드는 방법


 

 

9-3. Exception과 Error의 차이는?

프로그램 실행 중 오작동하거나 비정상적으로 종료되는 경우에 이 원인에 따라 프로그램 에러 혹은 오류라고 한다.

발생 시점에 따라 컴파일 에러, 런타임 에러등으로 나눌 수 있다. 

 

오류(Error) : 시스템에 비정상적인 상황이 생김. try to catch를 하기 어려움.

예외(Exception) : 개발자가 구현한 로직에서 발생한 오류. try to catch 할 수 있음.

9-2. 자바가 제공하는 예외 계층 구조

Exception Hierachy

 

ㅅ출처 geeksforgeek

 

9-4. RuntimeException과 RE가 아닌 것의 차이는?

Checked Exception vs Unchecked Exception.

Checked는 컴파일 시점에서 확인 될 수 있는 예외이다. 이는 Exception Handler가 강제로 적용된다.

Unchecked는 컴파일 단계에서 확인 되지 않는 예외이며, 프로그래머가 알아서 처리를 해야한다.

 

9-1. 자바에서 예외 처리 방법 (try, catch, throw, throws, finally)

try-catch

예외 처리 하는 가장 기본적인 방법

try{

	// 예외가 발생할 수 있는 가능성이 있는 코드
    
    }catch(ExceptionType e1){
    
    	// 예외 발생 시 이를 처리하는 코드
        
    }finally{
    
    	// 생략 가능하다.
        // 예외가 발생해도 마지막에 실행이 됨.
  } 
    
        

try 블럭 안에 여러 catch 블록이 올 수 있으나, 해당 예외가 발생하면 더이상의 try의 순차적인 실행은 일어나지 않고, catch문을 실행 한 뒤 finally 문으로 진행한다.

 

Multi catch

Java 7버전 이후에는 하나의 catch 블록에서 다중 Exception Type을 지정할 수 있다. 사용은 " | "를 사용한다.

단 예외 클래스가 부모 자식관계에 있으면 

try{

	...
    }catch( Exception_A | Exception_B  e) {
    		...
    }
    	

try-with-resources

이전 try-finally에서 자바 라이브러리에서 사용되는 close메소들를 호출해서 닫아줘야 하는 자원이 많다. 이는 클라이언트가 놓치기 쉬워서 성능 저하를 유발할 수 있다. 이를 위해 finalizer를 사용 했지만 이는 Java 9에서 Deprecated 되었다. 자원을 회수하기 위할 때 사용한다.

try(BufferedReader br = new BufferedReader(new FileReader(path))){
		...
	}catch(IOException e){
    	...
    }
}

throw vs throws

throw 키워드를 통해서 고의로 예외를 발생 할 수 있다. 특정 예외를 만났을 때 더욱 구체적인 예외로 처리하고자 할 때에 사용한다. 사용 시점에 무조건 예외가 발생한다.

throws 키워드는 메서드를 정의할 때 사용하며, 메서드 내에서 예외를 처리하지 않고 자신을 호출한 상위 메서드에서 예외를 처리한다.

 

public class A{
	public static void main(String[] args){
    	Test test = new Test();
        
        try{
        	test.test("1","!");
            }catch(NumberFormatException e){
            	System.out.parinln("1");
                }
         }
    }
}

class Test{
	public void test(String a, String b) throws NumberFormatException{
    	try{
        	int sum = Integer.parsInt(a) + Integer.parsInt(b);
            System.out.parinln("2");
         }catch(NumberFormatException e){
         	System.out.parinln("3");
            throw e;
         }
     }
}

/*--------------------------------------
출력 : 
3
1*/
       
           

위와 같이 throw는 직접 예외를 날리는 것이다. 위는 throw 와 throws를 동시에 사용 한 것이며, 아래는 throws 만 사용 하는 경우이다.

public class A{
	public static void main(String[] args){
    	Test test = new Test();
        
        try{
        	test.test("1","!");
            }catch(NumberFormatException e){
            	System.out.parinln("1");
                }
         }
    }
}

class Test{
	public void test(String a, String b) throws NumberFormatException{

        	int sum = Integer.parsInt(a) + Integer.parsInt(b);
            System.out.parinln("2");
       
     }
}

/*--------------------------------------
출력 : 
1
*/
       
           

테스트 메서드에서 예외가 발생 했으나 throws로 호출한 메서드로 넘어가서 A의 메인에서 catch를 했다.

 

9-5. 커스텀한 예외 만드는 방법

java platform에서 자신만의 예외 클래스를 만들 수 있다.

1. 자바에서 표현되지 않는 타입의 예외가 필요할 때.

2. 다른 벤더가 작성한 클래스에서 제공한 예외 사항과 차별화 할 수 있다면?

3. 코드가 하나 이상의 관련 예외를 발생할때.

4. 다른 사용자의 예외를 사용할 때 해당 예외에 대한 액세스 권한이 사용자에게 부여되는가?

에 대해 조건이 부합된다면 예외 클래스를 만들어서 사용한다.

Custom Checked Exception

public class IncorrectFileNameException extends Exception {
    public IncorrectFileNameException(String errorMessage) {
        super(errorMessage);
    }

    public IncorrectFileNameException(String errorMessage, Throwable err) {
    	super(errorMessage, err);
    }
}

---------------------------------------------------------------------------------

try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) {
        return file.nextLine();
   	 }
	} catch (FileNotFoundException e) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException(
          "filename is incorrect : " + fileName , e);
    }
    // ...
}

Custom Unchecked Exception

public class IncorrectFileExtensionException
  extends RuntimeException {
    public IncorrectFileExtensionException(String errorMessage, Throwable e) {
        super(errorMessage, e);
    }
}

---------------------------------------------------------------------------------
try (Scanner file = new Scanner(new File(fileName))) {
    if (file.hasNextLine()) {
        return file.nextLine();
    }
} catch (FileNotFoundException e) {
    if (!isCorrectFileName(fileName)) {
        throw new IncorrectFileNameException(
          "filename is incorrect : " + fileName , e);
    }
    // ...
} catch (IncorrectFileExtensionException e) {
    if(!containsExtension(fileName)) {
        throw new IncorrectFileExtensionException(
          "Filename does not contain extension : " + fileName, e);
    }
    //...
}

 

Reference
www.geeksforgeeks.org/exceptions-in-java/?ref=lbp

www.notion.so/9-17a778bba6ed4436ac3d7b9415b6babb

bvc12.tistory.com/196

velog.io/@youngerjesus/%EC%9E%90%EB%B0%94-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC

728x90

'Java > [Whiteship]자바스터디' 카테고리의 다른 글

11주차 과제 : Enum  (0) 2021.02.28
10주차 과제 : 멀티쓰레드 프로그래밍  (0) 2021.01.27
8주차 과제 : 인터페이스  (0) 2021.01.19
7주차 과제 : 패키지  (0) 2021.01.18
6주차 과제 : 상속  (0) 2021.01.17

+ Recent posts