[자바] throw/throws/try-catch

Nux·2022년 3월 9일
0
post-thumbnail
post-custom-banner

https://velog.io/@yoonee1126/Day26-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC 보충

에러와 예외

에러

  • 시스템레벨에서 발생. 프로그래머가 처리 불가

예외(Exception)

  • 프로그래머에 의해 발생. 처리 가능
  • 모든 예외는 Exception클래스의 자손
예외설명예외처리예시발생시점
checked Exception외부영향으로 발생필수IOException컴파일 시
runtime Exception프로그래머 실수로 발생필수 XIndexOutOfBoundException, ArithmeticException실행 시

주요메서드

public static void nanum(int a, int b) throws ArithmeticException{
	System.out.println(a/b);
}

public static void main(String[] args) {
	int a,b;
	a=100;
	b=0;
	try {
		nanum(a,b);
	} catch(ArithmeticException e) {
		System.out.println(e.getMessage());
		e.printStackTrace();
		System.out.println(e.toString());
	} finally {
		System.out.println("무조건 실행되는 문장");
	}
}

printStackTrace()

  • 예외 발생시의 메서드정보(근원지)와 예외메세지를 출력

getMessage()

  • 예외 원인 출력

toString()

  • 예외 내용과 원인 출력

try-catch

try {
	// 예외가 발생할 가능성이 있는 문장
} catch(Exception e){
	// Exception이 발생했을 때, 이를 처리하기 위한 문장
} catch(Exception2 e){
	// Exception2가 발생했을 때, 이를 처리하기 위한 문장	
}
  • 작성된 예외 중 일치하는 단 한개의 catch블럭만 수행됨
  • 예외가 발생하지 않는 경우 try-catch문을 빠져나감
  • try의 수행문 중간에 예외가 발생 할 경우, 하위 수행문은 실행되지 않음
try {
	System.out.println(1);
    System.out.println(0/10);	// 예외 발생(ArithmeticException). catch문으로 이동
    System.out.println(2);	// 실행되지 않음
} catch(Exception e){	// ArithmeticException가 처리 될 수행문
	System.out.println("예외발생");
}

multi catch

  • 여러 catch블럭을 하나로 합친 것
try{
	...
}catch(Exception1 | Exception2 e){
	e.printStackTrace();
}

finally

try{
	...
} catch(Exception c) {
	...
} finally {
	// 예외가 발생하던 안하던 실행 될 수행문
}
  • 예외 발생 여부와 상관없이 무조건 수행됨
  • try-catch문의 가장 마지막에 위치해야함

throw

  • 예외를 강제로 발생시킬 때 사용
  • 프로그램 실행 전 프로그래머가 직접 예외를 발생 시킬 수 있음
public static void main(String args[]){
	try{
    	throw new Exception("하이");
    } catch (Exception e) {
    	System.out.println(e.getMessage());
    }
}

// 출력값: 하이

throws

public void example(int a) throws Exception{}
  • 해당 메서드에서 예외를 처리하지 않고, 자신을 호출한 메서드에 예외를 전달
  • 호출한 메서드에서 예외처리를 하므로, 같은 예외여도 다른 처리가 가능
  • 명시된 예외는 어디에선가 반드시 처리가 되어야 함
public void method1(){
	int a,b;
    a = 10;
    b = 0;
    try {
    	methodA(a,b);
    }catch (ArithmeticException e){
    	System.out.println("처리방법1");
    }
}

public void method2(){
	int a,b;
    a = 0;
    b = 10;
    try{
    	methodA(a,b);
	} catch (ArithmeticException e){
    	System.out.println("처리방법2");
    }
}

public static void methodA(int a, int b) throws ArithmeticException{
	System.out.println(a/b);
}
  • 같은 예외(ArithmeticException)가 발생했지만 처리 결과는 다름

사용자정의 예외

  • 프로그래머가 직접 예외 생성 가능
  • 모든 예외의 부모클래스인 Exception 상속받아 사용
1. 예외정의
public class CustomException extends Exception{
	CustomException(String message){
    	super(message);	// 예외 객체 생성을 위한 Exception 생성자 호출
    }
}

2. 예외발생
public class Example {
	public static void main(String[] args){
      try {
          String name = "홍길동";
          if(name=="홍길동"){
              throw new CustomException("이미 존재하는 이름입니다.");
          }
      }catch (CustomException e) {
          e.printStackTrace();
      }
    }
}
1. 예외정의
public class CustomException extends Exception{
	CustomException(String message){
    	super(message);
    }
}

2. 예외발생
public class Example{
	public static void main(String[] args) throws CustomException{
      String name="홍길동";
      if(name=="홍길동"){
      	throw new CustomException("이미 존재하는 이름입니다.");
      }
    }
}

결론

  • throw/throw를 사용하는 이유: 여러곳에서 발생한 예외를 한곳에서 처리하기 위함
참고

https://tedock.tistory.com/80
https://sundrystore.tistory.com/14

post-custom-banner

0개의 댓글