seong

예외처리 Try - Catch 본문

자바/자바 실습

예외처리 Try - Catch

hyeonseong 2022. 8. 19. 14:36

예외처리 (Try- Catch)

  • try문 안에서 예외(오류)가 발생하면 catch가 실행된다. 
  • finally은 예외의 발생 여부와 상관 없이 무조건 실행된다.(생략 가능)

 

예외 처리 할때 크게 두가지 경우가 있다.

1. 컴파일시 발생하는 예외

  • 컴파일시 발생하는 예외는 코드에 빨간줄로 실시간으로 확인이 가능 하다. 

2. 런타임시 발생하는 예외

  • 런타임시 발생하는 예외는 코드에 에러는 나지 않고 제대로 실행은 했지만 콘솔창에서 나타나는 에러이다. 

예제1

동물 s1 = new 강아지 () 현재 메모리에는 말티즈가 존재 하지 않는다.

강아지 s2 = (말티즈) s1 말티즈가 존재 하지 않지만 가르키려고 한다. 

그래서 다운캐스팅시 오류가 발생하고, 아래의 for문이 실행 되지 못한다. 

실행시 다운 캐스팅 오류 발생 -> 실행시 오류가 나타났기 때문에 런타임 에러이다

위의 코드를 try-catch로 감싸보자

문제 생긴 코드를 try부분에 넣어 실행 하고 

try가 실패하면 catch를 실행하고 빠져 나와서 아래 for문을 실행한다. 

예제2

1. 강아지 s2객체를 try문 밖에서 null로 초기화

2. try로 s2 = 말티즈를 실행했다 -> 현재 메모리에는 말티즈가 없기 때문에 실패 

3. catch로 가서 s2 = new 말티즈()로 새로 말티즈를 생성해주었다.

강아지가 출력된 이유 s2 = new 말티즈() 를 하게 되면 강아지 s2 = new 말티즈()가 된다.
힙 메모리엔 말티즈, 강아지가 생성되고 강아지를 가르키는 객체가 되며, 강아지는 print메서드가 실행 되기 때문이다. 

런타임 에러 예제 1)

package except;



public class TryEx03 {
	
	public static void 나누기(int n1,int n2) {
		System.out.println(n1/n2);
		
		
	}
	
	public static void 순회하기(int n[]) {
		
	}
	
	public static void main(String[] args) {
		나누기(5,0); // 소스코드 아래 빨간줄이 안떴으면 런타임에러
	}

}

코드에는 문제가 없다

하지만 실행 후 0으로 나눌수 없기 때문에 런타임 에러가 발생 한다. 

 

예제 1)try-catch 런타임 에러 잡아주기

메서드 에서 try-catch로 런타임 에러 발생 시 출력문 작성 

런타임 에러 예제 2)

아래 코드는 메서드에서 0~2까지 반복 하게 되어있다.

하지만 실제 배열의 크기는 2로 선언을 해줘서 런타임 에러가 발생 한다.

인덱스의 갯수가 맞지 않다고 발생

 

예제 2) try-catch문으로 에러 잡아주기

Throws 예제)

오류제어를 메서드를 사용 하는 사람에게 권한을 주는 방법

아래의 코드를 이용해서 예제 연습

throws 사용

  • start에서 오류가 날수도 있으니까 오류 제어를 해놔 -> throws RuntimeException  
  • main 에서 try catch으로 오류를 제어 하는문 작성

 

try-catch에서 에러 처리 할때는 Exception(컴파일 에러), RuntimeException(런타임 에러 ) 두개를 구분해서 사용 하자. 

Runtime 에러가 아닌 것들은 Exception으로 하면 된다. 

package except;

import java.io.IOException;
import java.sql.SQLException;

class Car{
	String name = "소나타";
	
	void namePrint() {
		System.out.println(name);
	}
}

public class TryEx04 {

	public static void start(Car c) throws SQLException{
			c.namePrint();
	}
	
	public static void start2(Car c) throws IOException{
			c.namePrint();
	}
	
	public static void main(String[] args) {
		// 런타임 뜰것은 런타임으로만 처리 
		// 나머지는 Exception으로 사용. 
		try {
			start(null);
			start2(null);
		} catch (Exception e) { // Execption은 컴파일, 런타임,등등 한번에 둘다 잡아야할 경우 사용
			 e.printStackTrace();
		}
	}

}
Exception은 에러들의 부모 클래스이기 때문에 에러를 다 묶을수 있다.

'자바 > 자바 실습' 카테고리의 다른 글

URL 통신하기(naver.com 홈페이지)  (0) 2022.08.22
스트림(Stream) 통신 - BufferedReader,Writer  (0) 2022.08.22
23 다형성, 상속  (0) 2022.08.08
22 메소드 (Method)  (0) 2022.08.03
21 생성자,디폴트 생성자  (0) 2022.08.02