예외처리

소프트웨어를 사용하다보면 여러가지 상황의 오류를 맞이하게 된다.

잘 접속되던 사이트가 접속이 안 되거나, 스마트폰 앱이 갑자기 종료되는 경우와 같다.

오류가 발생하더라도 갑자기 종료되는 상황이 일어나지 않도록 하는것이 예외처리이다.

 

 

예외클래스의 종류

오류 클래스는 모두Throwable 클래스에서 상속을 받는다.

Error 클래스의 하위클래스는 시스템에서 발생하는 오류를 다루며 프로그램에서 제어하지 않는다.

Exception 클래스와 그 하위에있는 예외 클래스들이 프로그램을 제어한다.

자바에서 자주사용하는 예외클래스는 다음과 같다.

  1. ClassCastException : 수행할 수 없는 타입변환이 진행될 경우
  2.  ArrayIndexOutofBoundsException : 배열에 잘못된 인덱스를 사용하여 접근하는 경우
  3. NullPointerException : null 객체의 인스턴스 메소드를 호출하는 경우
  4. ArithmeticException : 산술연산에서 정수를 0으로 나누는 등 연산을 수행할 수 없는 경우

 

try-catch문

try{
	예외가 발생할 수 있는 코드부분
}catch(처리할 예외 타입 e){
	try블록 안에서 예외가 발생했을 때 예외를 처리하는 부분
}

위와 같이 코드 작성시 a.text 파일이 존재하지않는 오류가 발생할 수 있다는 경고문이 뜬다.

예외 상황에 대한 예외처리를 위해 'Surround with try/catch'를 클릭해 try-catch문으로 감싼다.

 

예외가 발생할 위험이 있는 코드는  try 블록으로 감싸고 예외가 발생하면 catch 블록을 수행한다.

try문으로 감싸진 부분에서 발생할 수 있는 예외는 FlieNotFoundException이고 변수이름은 e로 선언되었다.

그리고 어디에서 예외가 발생했는지 따라가는 printStackTrace() 메소드가 호출되었다.

코드를 실행해보면 결과화면에 예외 이름과 내용이 보인다.

 

예외가 발생했을 때 FileNotFoundException e의 toString() 메소드가 호출되는 코드이다.

 

출력결과에서 보면 첫번째 줄은 e의 출력내용이다.

만약 비정상 종료되었다면 다른수행이 일어나지 않았겠지만 두번째줄이 출력된 결과를 보면 

예외처리 후에도 프로그램이 계속 수행되었음을 알 수 있다.

 

 

try-catch-finally문

프로그램에서 사용한 리소스는 프로그램이 종료되면 자동으로 해제된다. 하지만 끝나지 않고 계속 수행되는 서비스같은

경우에는 리소스를 여러 번 반복해서 열기만 하고 닫지않는다면 문제가 발생한다.

따라서 사용한 리소스는 사용 후 close()메소드로 닫아 주어야한다.

만약 try블록 안에서 발생할 수 있는 예외상황이 여러개라면 catch블록을 예외상황 수만큼 구현을 해야한다.

하지만 리소스를 해제하는 코드를 각 블록에 모두 작성해야 한다면 매우 번거롭게된다.

이때 사용하는 블록이 'finally'이다. finally 블록은 어떤 경우에도 반드시 수행된다.

try{
	예외가 발생할 수 있는 부분
}catch(처리할 예외타입 e){
	예외를 처리하는 부분
}finally{
	항상 수행되는 부분
}

출력결과

입력받는 파일이 없는 경우에 대해 try-catch문을 사용해 FileNotFoundException 예외처리를 했다.

프로그램을 실행하면 a.txt파일이 없으므로 예외처리가 발생하여 catch 블록이 수행된다.

예외를 출력하고 17행에서 강제로 return을 했지만 상관없이 finally 블록이 수행되어 '항상 수행됩니다.'

문장이 출력되고있다.

 

 

try-with-resources문

자바 7부터 try-with-resources문을 제공하여 close() 메소드를 명시적으로 호출하지 않아도 try 블록 내에서

열린 리소스를 자동으로 닫도록 만들 수 있다.

try-with-resources 문법을 사용하려면 해당 리소스가 AutoCloseable 인터페이스를 구현해야한다.

AutoCloseable 인터페이스에는  close() 메소드가 있고 이를 구현한 클래스는 close()를 명시적으로 호출하지

않아도 정상적인 경우와 예외가 발생한 경우 모두 close()메소드 부분이 호출된다.

 

예외가 발생하지않고 정상종료되는 예제

//AutuClosealbe 인터페이스 구현하기
package javastudy2;

public class AutoCloseObj implements AutoCloseable{

	@Override
	public void close( ) throws Exception{
		System.out.println("리소스가 close() 되었습니다.");
	}
}
package javastudy2;

public class AutoClassTest {

	public static void main(String[] args) {
		try(AutoCloseObj obj = new AutoCloseObj()){
			
		}catch(Exception e) {
			System.out.println("예외부분입니다.");
		}
	}

}

try-with-resources 문을 사용할 때 try문의 괄호()안에 리소스를 선언한다.

출력결과

//소스코드를 여러개 생성해야하는 경우

try(A a = new A(); B b = new B()){
	....
}catch(Exception e){
	....
}

소스를 여러개 생성해야한다면 세미콜론(;)으로 구분한다.

 

 

예외가 발생하여 종료되는 예제

package javastudy2;

public class AutoClassTest {

	public static void main(String[] args) {
		try(AutoCloseObj obj = new AutoCloseObj()){
			throw new Exception(); //강제예외발생
		}catch(Exception e) {
			System.out.println("예외부분입니다.");
		}
	}

}

'throw new Exception()' 문장을 사용하면 프로그램에서 강제로 예외를 발생시켜 catch블록이 수행되도록 한다.

출력결과

 

향상된 try-with-resources문 (자바 9에서 추가된 문법)

package javastudy2;

public class AutoClassTest {

	public static void main(String[] args) {
   	    AutoCloseObj obj = new AutoCloseObj(); //리소스변수 외부선언
		try(obj){ //외부에서 선언한 변수를 그대로 쓸 수 있음
			throw new Exception(); //강제예외발생
		}catch(Exception e) {
			System.out.println("예외부분입니다.");
		}
	}

자바 9부터는 try문의 괄호 안에서 외부에서 선언한 변수를 그대로 사용할 수 있다.

 

 

예외 처리 미루기 (throws)

예외를 해당 메소드에서 처리하지 않고 미룬 후 메소드를 호출하여 사용하는 부분에서 예외를 처리하는 방법.

8행을 보면 FileNotFoundException 과 ClassNotFoundException 이 발생할 수 있는 예외처리를 미루겠다는 뜻의

'thows' 를 메소드 선언부에 추가하였다.

이 두가지 예외는 해당 메소드를 호출하여 사용하는 부분에서 예외처리를 해야한다.

main() 함수의 16행을 보면 loadClass() 메소드를 호출하는 부분에서 오류가 표시되고 세가지 옵션중 하나를 선택하여

오류를 처리할 수 있다.

  1. Add throws declaration : main() 함수 선언부분에서 throws FileNotFoundException , ClassNotFoundException을 추가하고 예외처리를 미룬다는 뜻. 하지만 예외를 처리하는 것이 아니라 대부분의 프로그램이 비정상 종료되기때문에 사용하지 않는 것이 좋다.
  2. Surround with try/multi-catch : 여러 예외를 한번에 처리하기
  3. Surrround with try.catch : 예외 상황마다 처리하기

 

 

Surround with try/multi-catch 옵션

이 옵션은 하나의 catch문에서 여러 예외를 한 문장으로 처리하겠다는 뜻이다.

 

Surround with try/catch 옵션

예외 상황의 수만큼 catch문이 생성된다.

각 예외 상황마다 다른 방식으로 처리해야하고 로그도 다르게 남겨야하는 경우 사용하는 옵션이다.

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

servlet  (0) 2022.11.15
Java 제네릭  (0) 2022.11.14
Java 인터페이스(interface)  (0) 2022.11.09
Java 추상 클래스  (4) 2022.11.08
Java 다형성  (0) 2022.11.08

+ Recent posts