[Java] 예외(Exception) (2)

당당·2023년 4월 19일
0

Java

목록 보기
13/20

https://velog.io/@dangdang/Java-예외Exception-1

📔설명

이전 게시글에 이어서 오늘 Java 예외를 마무리해보도록 하자.

ExceptionChecked ExceptionUnchecked Exception으로 나뉜다.
Checked Exception은
컴파일러가 예외가 발생할 것을 예상하고 컴파일이 되지 않는 것이고,
Unchecked는 그 반대일 것이다.

Unchecked ExceptionRuntimeException 포함 그 자식들이고,
Checked Exception은 RuntimeException 포함 자식 제외로 예외로 IOException이다.


💦IOException

import java.io.FileWriter;

public class CheckedExceptionApp {

	public static void main(String[] args) {
		FileWriter f=new FileWriter("data.txt");
		f.write("Hello");
		f.close();

	}

}

해당 소스코드를 작성 시,
빨간 밑줄이 생기는데, 마우스 커서를 가져다놓을시,
IOException에 대한 예외 처리를 하지 않았다고 뜬다.

import java.io.FileWriter;
import java.io.IOException;

public class CheckedExceptionApp {

	public static void main(String[] args) {
		try {
			FileWriter f=new FileWriter("data.txt");
			f.write("Hello");
			f.close();
		}catch(IOException e) {
			e.printStackTrace();
		}

	}

}

try-catch 문으로 감싸주면 이제 컴파일이 가능해진다.

실행시키면, 자바 프로젝트 파일 안에 data.txt가 생성된 것을 확인할 수 있다!


🌊Finally

자바가 프로그램 외부의 데이터에 접근하려고 할 때 생기는 문제가 있다.

외부 데이터는 파일 또는 네트워크, DB 등이 있는데, 이러한 것들을 Resource라고 한다.

이런 Resource들은 작업 중에 붙잡고 있다가 끝나면 해제해줘야한다.




위에서 작성한 코드 중 f.close()에 대해 살펴보자.

만약, f.close()위의 try안 문장에서 예외가 발생할 수 있다.

그러면 바로 catch로 들어가버리므로 close()명령 실행 기회를 잃어버리게 된다.

그러므로 이 f.close()를 finally 구문 안으로 옮기자!!

finally 구문은 예외가 발생하건 말건 무조건 실행된다!

그런데 finally 안으로 옮긴 f.close()에 빨간줄이 뜨고 이것은 초기화가
안됐기 때문인데,

만약 f가 셋팅이 되어있지 않으면 . 즉, f가 셋팅 되어있을 때만 f.close()를
실행하도록 해보자.

또 빨간 밑줄이다!!

import java.io.FileWriter;
import java.io.IOException;

public class CheckedExceptionApp {

	public static void main(String[] args) {
		FileWriter f=null;
		try {
			f=new FileWriter("data.txt");
			f.write("Hello");
		}catch(IOException e) {
			e.printStackTrace();
		}finally {
			if(f!=null) {
				try {
					f.close();
				}catch(IOException e) {
					e.printStackTrace();
				}
			}
		}

	}

}

요렇게 수정해주면 해결이 된다~
하지만 너무 더러운데..


📎try-with-resource

close가 필요한 resource 작업 할 때 코드가 너덜너덜해지는 것을 막기 위한 것이 등장했다.

클래스가 AutoCloseable이라는 인터페이스를 가지고 있다면,
try-with-resource라는 문법을 사용할 수 있다.

이전에 사용하던 try와 다르게
try(){}를 쓰고, () 안에 close 시켜야 하는 문장을 넣는다.

우리가 작성한 소스코드에서는
FileWriter f=new FileWriter("data.txt") 이 문장이다. (세미콜론 제외)

import java.io.FileWriter;
import java.io.IOException;

public class TryWithResource {

	public static void main(String[] args) {
		try (FileWriter f=new FileWriter("data.txt")){
			f.write("Hello");
		}catch(IOException e) {
			e.printStackTrace();
		}
	}

}

이 코드는 결국 이전에 작성했던 수많은
try-catch-finally, try-catch 문과 같아지게 된다!

처음 배운다!

그리고 f.close(); 는 필요가 없어진다! 자동으로 해주니까!

훨씬 보기가 좋다!


📮throw 와 throws

내가 스스로 예외를 발생시킬 수도 있다.

throw

public class MyException {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		throw new RuntimeException("Something Wrong");
	}

}

실행시키면 이렇게 예외가 발생한다!

throws

import java.io.FileWriter;
import java.io.IOException;

public class ThrowException {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		FileWriter f=new FileWriter("./data.txt");
	}

}

파일을 수정하는 코드를 짜기 위해 작성했다.

throws IOException을 저렇게 작성하면,
이제 저 코드를 사용하는 쪽에서 예외를 처리해야한다.


🕦이후

다음은 자바의 메소드에 대해 공부할 것이다~

profile
MySQL DBA 신입 지원

0개의 댓글