자바의 정석 8장 (21일차) - 메서드에 예외 선언 & finally

728x90

메서드에 예외 선언하기

예외를 처리하는 방법은 3가지가 있는데 본인이 (1)직접 해결(try - catch)하거나 (2)예외를 선언하여(예외 떠넘기기) 다른쪽에 넘기거나, 혹은 (3)은폐(catch문에 공백으로 남기기)하는 법이 있다.

 

메서드에 예외를 선언한다는 것은 아래와 같이 메서드에 throws를 붙여 발생할 수 있는 에러의 종류를 나열하는 것이다

  • 아래 메서드 method에는 arithmeticexceptoin이나 (or) index초과 오류가 날 수도 있다는 것을 정의
    • 따라서 메서드안에서 아래의 에러를 처리할 수 있는 try - catch를 선언하던지 혹은 호출한 쪽으로 에러를 떠넘기던지 둘 중에 하나의 액션을 취해야 한다.
    • 주의할 점은 main안의 throw가 아닌 throws로 s를 붙여서 선언해야한다.
	void method() throws ArithmeticException, IndexOutOfBoundsException {
	}

 

 

메서드에 예외를 선언할 때 메서드마다 예외처리를(try - catch)를 하지 않으면 호출했던 클래스, main 클래스로 되돌아가 오류를 반환하면서 프로그램을 비정상 종료시킨다.

  • 이때 메인클래스도 throws Exception을 추가하여야 정상적으로 컴파일이 된다.
    • Exception오류가 발생할 수도 있다는 것을 정의해야되기 때문
package Lecture;

public class MethodException {
	public static void main(String[] args) throws Exception {
		method(); //메서드를 호출
		
//		오류를 처리할 방법이 없어서 프로그램 비정상종료
	}
	static void method() throws Exception {
		method2(); //메서드를 호출받아 메서드2를 호출
	
//		오류를 반환받았지만 try -catch문이 없어 다시 main클래스로 오류를 반환
	}
	static void method2() throws Exception {
			throw new Exception(); //호출받은 메서드가 오류가 발생하여 다시 메서드로 오류를 반환
	}
}

메서드에 예외 선언하기 예시

File 클래스를 사용해 새 파일을 만드는 과정에서 만약 생성하는 확장자가 .txt 파일이 아니라면 오류를 생성해 호출한 메인 클래스로 되돌아가서 try - catch로 오류를 해결하는 과정이다

  1. 메인 클래스에서 생성한 메서드를 호출
  2. 호출한 메서드에 매개변수 2개를 입력하여 파일을 생성
  3. 만약 매개변수가 공백이거나 .txt확장자가 아니라면 오류를 생성하여 메인 클래스로 오류를 반환함
    1. 왜냐하면 메서드에 try-catch를 선언하지 않았기 때문 (메서드 예외 선언)
  4. 반환한 오류를 try - catch로 해결하여 원하는 문구 정상 출력 후 프로그램 정상 종료
    1. 만약 프로그램대로 txt 확장자에 중복되는 파일이 없다면 파일 정상 생성 후에 프로그램 종료
package Lecture;

import java.io.File;

public class MethodException{
	public static void main(String[] args) throws Exception{
		try {
			filecreate("C:\\Users\\gram\\Desktop\\새 폴더", "test.txt");
		}
		catch (Exception e) {
			System.out.println("파일을 .txt 형식으로 다시 입력해주세요");
		}
		
	}
	static void filecreate(String path,String filename) throws Exception{
		File f = new File(path + "\\" + filename);
		if(filename == null || !filename.endsWith(".txt")) {
			throw new Exception();
		}
		else if(f.isFile()) {
			if(f.getName().equals(filename)) {
				System.out.println(f.getName() + "와 동일한 파일명의 파일이 이미 존재합니다");
			}
		}
		else {
			try {
				f.createNewFile();
				System.out.println(f.getName() + "파일 생성완료");
//				이 때 test.txt 파일을 생성하기 위해서는 경로에 생성이름과 확장자명을 적어야 생성된다.
			}
			catch (Exception e) {
				e.getMessage();
			}
		}
	}
}

finally

프로그램을 실행하고 오류와 상관없이 무조건 실행되는 문장을 finally 구문에 넣는다

따라서 아래의 코드는 어떤 결과던 상관없이 프로그램이 정상종료된다면 "프로그램이 종료됩니다" 구문이 출력된다.

public class MethodException{
	public static void main(String[] args) throws Exception{
		try {
			filecreate("C:\\Users\\gram\\Desktop\\새 폴더", "test.txt");
		}
		catch (Exception e) {
			System.out.println("파일을 .txt 형식으로 다시 입력해주세요");
		}
		finally {
			System.out.println("프로그램을 종료합니다");
		}
	}

 

728x90