본문 바로가기
language/Java

Try ~ Catch 문

by abstract.jiin 2022. 6. 30.

 

 

Try ~ Catch 문 - 예외 처리는, 

예외 오류가 발생하면, 프로그램이 갑자기 작동을 멈추거나 갑자기 종료되곤 한다. 

이를 방지 하고 대처할 시간을 잠깐 벌어서 예외가 발생 했을 때 어떤 식으로 대처할 지를 미리 정해두는 것이다.

 

형식

try{ 예외가 발생 할 만한 코드 

} catch(해당 예외 코드 또는 Exception e) {

예외 처리를 위한 루틴

} finally {

예외 발생 유무와 상관 없이 무조건 실행하는 코드

}

 

작동 순서 

try 구문으로 진입 > try 블록 안에서 예외가 발생 할 경우 catch

> 예외가 있을 경우 해당 블록으로 가서 실행 > finally 블록 무조건 실행 

 

Try ~ Catch 문 내에서 자주 쓰이는 ~ .

System.out.println("원인: " +e.getMessage()); > 원인을 메시지로 출력 

e.printStackTrace();   > 에러 안내문 출력 

 

오류 예시

1) 정수 숫자를 0으로 나누면 =>ArithmeticException 예외 오류 발생

더보기

 

public class Ex01Try {
	public static void main(String[] args) {

		int a = 10, b01=0, b02=2, result=0;
		
		try {
			result=a/b02; 
			System.out.println(result);
			
			result=a/b01; //예외가 발생해서 아래 문장 수행하지 않고 프로그램 실행 순서 제어가 catch블록으로 이동 
			System.out.println(result);//이 문장 수행 안함 			
		
		} catch(Exception e) {
			System.out.println("예외 발생 "+e);
		}
	}
}

 

 

2) 큰 따옴표가 포함된 "a100", "7a" 와 같은 숫자외의 문자가 포함된 문자열을 정수 숫자로 변경하려면 
=> 변경하지 못하고 NumberFormatException 예외 오류가 발생 

더보기

 

public class Ex06Try {

	public static void main(String[] args) {
		
		
		String data01="100";
		String data02="a100";
		
		
		try {
			int value01 = Integer.parseInt(data01);
			int value02 = Integer.parseInt(data02);
			//"a100"을 정수 숫자로 변경 하려다가 a문자 때문에 변경 못하기
			// > 이런 경우 발생되는 예외 오류가 NumberFormatException이다.
			
			int result=value01+value02;
			System.out.println(value01+" + "+ value02+" + "+ result );
			
		}catch(Exception e) {
			System.out.println(e.getMessage()); //예외 오류 메시지 출력
			e.printStackTrace();// 예외 족적을 알려줌
		}

	}

}

 

 

3) 배열주소 인덱스 번호를 벗어날 경우 => ArrayIndexOutOfBoundsException 발생

더보기

 

public class Ex05Try {

	public static void main(String[] args) {

		int arrNum[] = {10,20,30};
		
		try {
			System.out.println("Test-1");
			arrNum[3]=40; //없는 배열주소에 접근 -> 예외 오류 발생 , 아래 문장 수행하지 않고 catch 블록으로 이동 
			
			System.out.println("Test-2"); //이 문장 수행 안함. 
		
		}catch (Exception e) {
			e.printStackTrace();
			
		}
	}

}

 

 

4) * 검색해 보니 많은 사람들이 두려워하는 예외오류라고 하며 여러가지 오류 유형이 있는 듯 하다. 

null을 가지고 있는 객체/ 변수 등을 호출할 경우 => NullPointerException 예외 발생

 

더보기

 

//NullPointerException 예외 오류 실습 

class MyDate {
	int year=2022;
	int month=6;
	int date=30;
	
}
public class Ex04Try {

	public static void main(String[] args) {
		
		MyDate d=null;
		
		try {
			System.out.println(d.year+"년"+d.month+"월"+d.date+"일");
		}catch(Exception e) {
			System.out.println("예외 발생 : "+e);
			d=new MyDate();
			System.out.println(d.year+"년"+d.month+"월"+d.date+"일");
		}//try~catch
		

	}

}

 

 

기타 

- 복수개의 catch{} 블록이 만들어 질 때는 예외 처리 자손 클래스가 먼저 나오고 
 * 부모클래스가 나중에 나온다 . (자손이 더 구체적이기 때문에)

- 예외 발생시 먼저 예외 발생한 catch{}블록 하나만 들러서 실행한다. 

 

public class TryCatchCase01 {

	public static void main(String[] args) {
		int[] iarr = {1, 2, 3};
		
		try {
		System.out.println(iarr[0]);
		System.out.println(iarr[1]);
		System.out.println(iarr[2]);
		System.out.println(3/0);
		System.out.println(iarr[3]);
		System.out.println(iarr[4]);
		System.out.println(iarr[5]);
		}catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("예외가 발생하였습니다.");
		
			System.out.println("원인: " +e.getMessage());
			System.out.println("예외 처리 완료!");
			e.printStackTrace();
		}catch(ArithmeticException e) {
			System.out.println("3/0 은 불가능 하다.");
			System.out.println("원인: " +e.getMessage());
			System.out.println("예외 처리 완료!");
			e.printStackTrace();
		}finally {
			System.out.println("예외를 처리했거나 정상 종료되었습니다.");
		}
		}
		//예외 처리를 하고 나면 예외 발생 지역으로 돌아가지 않는다. 
		//사용자가 지정한 에러 외의 예외가 발생하면 처리되지 않는다. > catch를 여러개 쓸 수 있다. 

}

실행 결과 

더보기

1
2
3
3/0 은 불가능 하다.
원인: / by zero
예외 처리 완료!
java.lang.ArithmeticException: / by zero
at TryCatchCase01.main(TryCatchCase01.java:11)
예외를 처리했거나 정상 종료되었습니다.

 

 


throw,

예외가 발생하지 않는 프로그램에서 인위적으로 예외를 발생 시키는 경우가 있다. 

 

형식

throw 예외객체; 

또는 throw new 예외클래스(전달인자)

 

//throw 와 throws 키워드 실습 예제  >> 실습용
public class Ex07Try {

	public static void exp(int a) throws NullPointerException {
		if(a == 0) {
			throw new NullPointerException(); //인위적 예외 발생 
		}
	}
	public static void main(String[] args) {
		try {
			System.out.println("메서드 호출전");
			exp(0); //예외 발생 
			
			System.out.println("메서드 호출후"); //이 문장 수행 안함
			
		}catch(NullPointerException e) {
			e.printStackTrace();
			
		}//try~catch

	}

}

 

 

throw 와 throws 차이점

 

1) throw 는 예외를 일부러 발생시킬 때 사용

>  throw new 예외 클래스 생성자 ; 

2) throws 는 발생된 예외를 자신이 직접 처리하는 것이 아니라 자신을 호출한 객체로 넘길 때 사용 

>  public void 메서드이름(매개변수) throws Exception { ... } 

 

throws 사용 예제 

더보기
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;

/*
 * java 7에서 추가된 AutoCloseable 인터페이스를 구현 상속받은 자손은 try() 내에서 객체를 생성하면 
 * 명시적으로  finally문에서 close() 하지 않아도 자동으로 닫힌다. 
 */

public class Ex09Try {
	public static void main(String[] args) throws Exception {
		
		List<String> nameList=new ArrayList<>();
		
		nameList.add("Hong gil dong");
		nameList.add("Lee sun shin");
	
		
		try(PrintWriter out=new PrintWriter("./src/result.txt")){
			//printWriter는 출력스트림(java.io)
			
			for(String name: nameList) {
				out.println(name.toUpperCase()); //영문 대문자로 result.txt파일에 기록.
			
			}//for			
		}
	}
}

'language > Java' 카테고리의 다른 글

[실습] try ~ catch ~ finally + ArrayList 복습하기  (0) 2022.06.30
[실습] interface, static method, default method  (0) 2022.06.26
ArrayList_List Collection  (0) 2022.06.23
[응용 예제] Bingo  (0) 2022.06.21
2차원 배열(Array)  (0) 2022.06.21