[Java] 11. 예외 처리 (1)

2023. 10. 23. 00:13Java언어 공부

예외 처리의 목적

- 오류를 발견하기 위한 목적

- 비정상적인 경우가 발생할 때 프로그램이 죽지 않고 이어가기 위해서.

 

예외란?

정상적인 경우에는 일어나지 않지만 발생할 수 있는 문제를 말한다.

 

개발 과정 : 예외 처리를 통해 프로그램 오류 발견 및 수정

개발 이후 : 예외가 발생하여도 프로그램이 계속 수행될 수 있도록 한다.

 

프로그램이 자체적으로 극복할 수 없는 예외에 대해서는 다음을 보장해 주어야 한다.

 

- 사용자에게 오류 사실을 알린다.

- 더 이상 수행이 가능하지 않으면 현재 작업을 저장한다.

- 우아하게 종료할 수 있도록 해준다. (프로그램이 죽는다고 시스템이 죽으면 안됨)

 

여러가지 오류들

사용자 입력 오류 -> 인터페이스를 잘 만들면 됨

장치 오류, 물리적 제한 -> 극복할 수 없음. 사용자에게 알려야 함

실행시간 논리 오류 : 프로그램 작성 (예외 처리 해야 함)

 

예외 처리 방법

 

try{
	//실행할 함수들
}
catch()
{
	실행한 함수 1에 대한 예외
}
catch()
{
	실행한 함수 2에 대한 예외
}
...

 

1. 예외가 발생하면 자동으로 그것을 처리하는 곳으로 이동한다. (JVM까지 안가면 됨)

2. 예외가 발생하면 그 이후의 코드는 실행하지 않음

 

=> 프로그램의 주 로직에서 오류 처리 부분을 제외할 수 있다.

     오류 처리 위치를 유연하게 결정할 수 있다.

     함수의 반환 타입에 영향을 받지 않고 사용할 수 있다.

 

자바에서는?

- 어떤 메소드가 어떤 예외를 발생할 수 있는지 공표할 수 있다.

- 일부 예외는 처리르 강제화하고 있다.

 

예외 예시 알아보기

 

 

이러한 코드가 있다고 가정하자.

 

 

실행시키면 이러한 코드가 발생한다.

- 발생한 예외 : java.lang.ArithmeticException (산술 오류)

- 예외 세부 분류 : / by zero

- 발생된 위치 : main 메소드의 10번째 줄번호

 

public static void main(String[] args)
	{
		try
		{
			int x = 10;
			int y = 0;
			int z = 0;
			z = x / y;
			System.out.println("End of try clause");
		}
		catch(ArithmeticException e)
		{
			System.out.println("Exception caught: "+e.getMessage());
		}
		System.out.println("End of program");
	}

 

이러한 코드를 짜보자.

실행하면

 

아래와 같이 뜬다. (try 안에 오류가 뜬 위치부터는 코드를 실행하지 않는다)

 

throw

내가 직접 예외를 발생하고 싶은 경우 사용가능하다.

에외와 관련된 정보를 캡슐화하고 있는 객체를 생성하고,

알려서 처리할 수 있는 곳까지 이동해서 실행한다.

 

throw new 오류객체이름("오류 내용")

 

!! JVM까지 해당 예외 객체가 전달되면 JVM은 이 문자열을 콘솔에 출력하여 준다. !!

 

catch

try에서 실행한 함수들에서 발생한 오류들을 catch에서 잡아서 처리할 수 있다.

발생한 예외를 잡을 수 있는 catch절이 없으면 함수는 종료되고, 예외는 다시 상위 함수로 전달된다.

 

catch( 오류 이름 | 오류 이름 e)
{
	//오류 처리 (ex. e.getmessage)
}

 

순서가 중요하다. 상속 관계에 있을 때 후손 클래스의 catch가 밑에 있고,

부모 클래스의 catch가 위에 있다고 가정하면 후손클래스의 예외는 부모 클래스의 catch에서 처리된다.

 

finally

try가 실행되고 catch가 실행되든 안되든 무조건 실행하는 함수이다.

 

try-with-resource

파일 처리와 관련이 있음

예전에는 파일을 닫기 위해서 finally를 썼었는데,

 

try(
	FileReader reader = new FileReader("input.txt");
){
	//실행할 코드
}

 

지금은 이렇게만 써줘도, 알아서 finally를 사용하지 않아도 파일을 닫아준다.

 

예외 공표

공표해야 하는 예외가 여러개면 ,로 구분해서 나열한다.

 

void f() throws IOException, ListFullException
{
	//
}

 

단 상속관계에 있다면 부모 예외 경우만 공표하면 된다.