
์๋ฌ:ํ๋ก๊ทธ๋จ ์ฝ๋์ ์ํด์ ์์ต๋ ์ ์๋ ์ฌ๊ฐํ ์ค๋ฅ
์์ธ : ํ๋ก๊ทธ๋จ ์ฝ๋์ ์ํด์ ์์ต๋ ์ ์๋ ๋ค์ ๋ฏธ์ฝํ ์ค๋ฅ
๐ง ์๋ฌ๋ ์ด์ฉ ์ ์์ง๋ง... ์์ธ๋ ์ฒ๋ฆฌํด์ผํจ!
์ปดํจํฐ ํ๋์จ์ด์ ์ค์๋ ๋๋ ๊ณ ์ฅ์ผ๋ก ์ธํด ์์ฉํ๋ก๊ทธ๋จ ์คํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ์๋ฌ(error)๋ผ๊ณ ํฉ๋๋ค. ํ๋ก๊ทธ๋จ์ ๋ง๋ค๋ค๋ณด๋ฉด ์ด๋ฐ ์๋ฌ ์ํฉ์ ์ฒ๋ฆฌํด์ผํ ๋๊ฐ ์๋๋ฐ, ์ด๊ฒ์ ์์ธ์ฒ๋ฆฌ๋ผ๊ณ ํฉ๋๋ค.
์๋ฌ ์ํฉ์์ ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ์ข ๋ฃ๊ฐ ๋๋๊ฒ ์๋๋ผ, ์๋ฌ ์ํฉ์ ์ฒ๋ฆฌํด์ค์ผ๋ก์จ ํ๋ก๊ทธ๋จ์ด ์ ์ ์คํ ์ํ๊ฐ ์ ์ง๋๋๋ก ํ ์ ์์ต๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ค์๋์ ํ์ง ์๊ฒ ํ๊ธฐ์ํ ์๋ฐ์ ๋ฐฐ๋ ค๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
์์ธ์ ๋ํ์ฌ ๊ตฌ์ฒด์ ์ผ๋ก ์์๋ณด๊ธฐ ์ ์, ์ด๋ค ์ํฉ์์ ์์ธ๊ฐ ๋ฐ์ํ๋์ง ์ดํด๋ด ์๋ค.
๋ค์๊ณผ ๊ฐ์ด ์กด์ฌํ์ง ์๋ ํ์ผ์ ์ด๊ธฐ ์ํ ์๋ฐ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ด ์๋ค.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ExceptionSample {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("์กด์ฌํ์ง_์๋_ํ์ผ"));
br.readLine();
br.close();
}
}
์ด ์ฝ๋๋ฅผ ์คํํ๋ฉด, ์กด์ฌํ์ง ์๋ ํ์ผ์ ์ฝ์ผ๋ ค ํ๊ธฐ ๋๋ฌธ์, ์ํ๋ ํ์ผ์ ์ฐพ์ ์ ์๋ค๋ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
java.io.FileNotFoundException

๋ ๋ค๋ฅธ ์ฝ๋๋ฅผ ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฒ์๋ 0์ผ๋ก ๋ค๋ฅธ ์ซ์๋ฅผ ๋๋๋ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด๋ด
๋๋ค.
public class DivideExceptionSample {
public static void main(String[] args) {
int result = 5 / 0;
}
}
์๋ฐ์์๋ ์ซ์๋ฅผ 0์ผ๋ก ๋๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ฐ์ ์ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค๋ ArithmeticException์ด ๋ฐ์ํฉ๋๋ค.

๋ง์ง๋ง์ผ๋ก ํ๊ฐ์ง ์์๋ฅผ ๋ ๋ณด๊ฒ ์ต๋๋ค.
public class ArrayExceptionSample {
public static void main(String[] args) {
int[] array = {3, 4, 5, 6};
System.out.println(array[5]);
}
}
์ฝ๋๋ฅผ ๋ณด๋ฉด array ๋ฐฐ์ด ํฌ๊ธฐ๊ฐ 4๊ฐ์ธ ์ซ์๋ฅผ ์ ์ธํ๋๋ฐ, ์ธ๋ฑ์ค ๋ฒ์๋ฅผ ์ด๊ณผํ์ฌ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ถ๋ ฅ๋ฌธ์์ 5๋ฒ์งธ ์ธ๋ฑ์ค๋ฅผ ํธ์ถํ๊ณ ์์ผ๋ ๋น์ฐํ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฒ ์ฃ . ArrayIndexOutOfBoundsException์ด ๋ฐ์ํฉ๋๋ค.

์๋ฐ๋ ์ด์ ๊ฐ์ด ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํ๋ก๊ทธ๋จ์ ์ค๋จํ๊ณ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๋ง์ฝ ์ด ๊ฒฝ์ฐ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค๋ฉด, ํ๋ก๊ทธ๋จ ์ค๋จ์์ด ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ๋ค์ ํ๋ก์ธ์ค๋ก ๋์ด๊ฐ๋๋ก ์กฐ์นํด์ค ์ ์๊ฒ ์ฃ . ์ด๊ฒ์ด ๋ฐ๋ก ์๋ฐ์์์ ์์ธ์ฒ๋ฆฌ ์
๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ์ด์๊ฐ์ ๋์ฒ ๋ฐฉ๋ฒ์ด ์๊ฒ ์ฃ !
์ฐ์ ์์ธ ํด๋์ค์๋ ๋๊ฐ์ง ์ข ๋ฅ๊ฐ ์์ต๋๋ค. ํ๋๋ ์ผ๋ฐ ์์ธ(Exception), ๋ค๋ฅธ ํ๋๋ ์คํ ์์ธ(Runtime Exception)์ ๋๋ค.
์ผ๋ฐ ์์ธ๋ ์ปดํ์ผ๋ฌ ์ฒดํฌ ์์ธ(Checked Exception) ๋ผ๊ณ ๋ ํ๋๋ฐ, ์ปดํ์ผํ๋ ๊ณผ์ ์์ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ํ์ํ์ง ๊ฒ์ฌํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ง์ฝ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ์๋ค๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์คํ ์์ธ๋ ์ปดํ์ผํ๋ ๊ณผ์ ์์ ์์ธ ์ฒ๋ฆฌ ์ฝ๋๋ฅผ ๊ฒ์ฌํ์ง ์๋ ์์ธ(Unchecked Exception)๋ฅผ ๋งํฉ๋๋ค. ์ปดํ์ผ์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ธํ๋ ์ฐจ์ด์ผ ๋ฟ, ๋ ๊ฐ์ง ์์ธ๋ ๋ชจ๋ ์์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ฆผ์ผ๋ก ์ฐพ์๋ณผ๊น์?



์์ ์ดํด๋ณธ ์์ธ๋ค์ ์ฒ๋ฆฌํ๊ธฐ ์ํด try-catch๋ฌธ์ ์ฌ์ฉํด๋ด ์๋ค. ๋จผ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
try {
<์ํํ ๋ฌธ์ฅ 1>;
<์ํํ ๋ฌธ์ฅ 2>;
...
} catch(์์ธ1) {
<์ํํ ๋ฌธ์ฅ A>;
...
} catch(์์ธ2) {
<์ํํ ๋ฌธ์ฅ a>;
...
}
ํน์
try {
<์ํํ ๋ฌธ์ฅ 1>;
<์ํํ ๋ฌธ์ฅ 2>;
...
} catch (์์ธ1 | ์์ธ2) { // ๋ ์ค ํ๋๊ฐ ์์ธ์ผ ๊ฒฝ์ฐ A ์ํ (๋ฉํฐ catch)
<์ํํ ๋ฌธ์ฅ A>;
...
}
์ ์ฝ๋์ ๊ฐ์ด ๋ ํํ์ catch๋ฌธ์ด ๋ชจ๋ ๊ฐ๋ฅํฉ๋๋ค.
์ฒซ ๋ฒ์งธ ์ฝ๋์ try๋ฌธ ์์ ์์ธ๊ฐ ๋ฐ์ํ์ฌ catch ์์ธ1์ด ์ํ๋๋ค๋ฉด ๊ทธ ๋ค์ ์์ธ2์ catch๋ฌธ์ ์ํ๋์ง ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ try๋ฌธ ์์ ์ํํ ๋ฌธ์ฅ ์ค ์์ธ๊ฐ ๋ฐ์ํ์ง ์๋๋ค๋ฉด catch๋ฌธ ์์ ๋ด์ฉ์ ์ํ๋์ง ์์ต๋๋ค. ํ์ง๋ง try๋ฌธ ์ํ ์ค ์์ธ๊ฐ ๋ฐ์ํ๋ฉด catch๋ฌธ์ด ์ํ๋ฉ๋๋ค.
์์์ ๋ดค๋ ์ค๋ฅ๋ฅผ ๋ค์ ํ ๋ฒ ๋ณด๊ณ , ์์ธ์ฒ๋ฆฌ ํด๋ณด๊ฒ ์ต๋๋ค.
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
public class ExceptionSample {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("์กด์ฌํ์ง_์๋_ํ์ผ"));
br.readLine();
br.close();
}
}
...
public class ExceptionSample {
public static void main(String[] args) {
**try {**
BufferedReader br = new BufferedReader(new FileReader("์กด์ฌํ์ง_์๋_ํ์ผ"));
br.readLine();
br.close();
**} catch (IOException e) {**
System.out.println("error message: " + e.getMessage());
**}**
}
}
์์ธ์ฒ๋ฆฌ ํ ํ์ ์ฝ๋๋ฅผ ์คํํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
error message: ์กด์ฌํ์ง_์๋_ํ์ผ (No such file or directory)
try๋ฌธ ์์ FileNotFoundException์ด ๋ฐ์ํ๋ฉด catch ๋ฌธ์ ๋ด์ฉ์ด ์คํ๋ฉ๋๋ค. ์ ์ฝ๋์์๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ณ ์์ฃ .
๋ค๋ฅธ ์์๋ try-catch๋ฌธ์ ์ฌ์ฉํ๋๋ก ์์ ํด๋ณด๊ฒ ์ต๋๋ค.
0์ผ๋ก ์ซ์๋ฅผ ๋๋ด์ ๋ ArithmeticException์ด ๋ฐ์ํ์ง๋ง, ์ด๊ฒ์ UncheckedException์ด์ฃ . ํ์ง๋ง ๋ชจ๋ ์๋ฌ๋ ์์ธ์ฒ๋ฆฌ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ try-catch๋ฌธ์ผ๋ก ๊ฐ์ธ์ฃผ๊ฒ ์ต๋๋ค.
public class DivideExceptionSample {
public static void main(String[] args) {
int result;
try {
result = 5 / 0;
} catch (ArithmeticException e) {
result = -1;
System.out.println("์ซ์๋ 0์ผ๋ก ๋๋ ์ ์์ต๋๋ค.");
}
}
}
์ซ์๋ 0์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
์ด์ ์ฒ๋ผ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์๋ค๋ฉด, ์๋ฌ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ฉด์ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋์ง๋ง, ์ ์ฝ๋์ฒ๋ผ try-catch ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๋ฉด ์๋ฌ ๋ฐ์์ catch๋ฌธ์ด ์คํ๋ฉ๋๋ค. catch๋ฌธ์์๋ ์์ธ ๋ฐ์์ result์ -1์ ๋์ ํ๋๋ก ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค์ค catch๋ฌธ์ ์์ฑํ ๋ ์ฃผ์ํ ์ ์, ์์ ์์ธํด๋์ค๊ฐ ํ์ ์์ธ ํด๋์ค๋ณด๋ค ์๋์ชฝ์ ์์นํด์ผํ๋ค๋ ๊ฒ ์ ๋๋ค. ์๋ ์ฝ๋๋ฅผ ํ๋ฒ ๊ณ ์ณ๋ด ์๋ค.
try {
(ArrayIndexOutOfBoundsException ๋ฐ์)
(NumberFormatException ๋ฐ์)
} catch(Exception e) {
์์ธ์ฒ๋ฆฌ1
} catch(ArrayIndexOutOfBoundsException e) {
์์ธ์ฒ๋ฆฌ2 // ์ปดํ์ผ ์ค๋ฅ
}
์ด ์ฝ๋์์ ArrayIndexOutOfBoundsException ์์ธ์ NumberFormatException ์์ธ๋ ๋ชจ๋ Exception์ ์์๋ฐ๊ธฐ ๋๋ฌธ์ ์ฒซ๋ฒ์งธ catch ๋ธ๋ก๋ง ์ ํ๋์ด ์คํ๋ฉ๋๋ค. ๋๋ฒ์งธ catch๋ธ๋ก์ ์ด๋ค ๊ฒฝ์ฐ์๋ผ๋ ์คํ๋์ง ์๋ ์ฝ๋๋ผ๋๊ฑฐ์ฃ . ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ด ์์ ํด์ผํฉ๋๋ค.
try {
(ArrayIndexOutOfBoundsException ๋ฐ์)
(NumberFormatException ๋ฐ์)
} catch(ArrayIndexOutOfBoundsException e) {
์์ธ์ฒ๋ฆฌ1
} catch(Exception e) {
์์ธ์ฒ๋ฆฌ2
}
try ๋ธ๋ก์์ ArrayIndexOutOfBoundsException์ด ๋ฐ์ํ๋ฉด ์ฒซ๋ฒ์งธ catch ๋ธ๋ก์ ์คํํ๊ณ , ๊ทธ ๋ฐ์ ๋ค๋ฅธ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋ ๋ฒ์งธ catch ๋ธ๋ก์ ์คํํฉ๋๋ค.
ํ๋ก๊ทธ๋จ ์ํ ๋์ค ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ํ๋ก๊ทธ๋จ์ด ์ค๋จ๋๊ฑฐ๋ ์์ธ ์ฒ๋ฆฌ์ ์ํด catch ๊ตฌ๋ฌธ์ด ์คํ๋ฉ๋๋ค. ํ์ง๋ง ์ด๋ค ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ฐ๋์ ์คํ๋๋ ๋ถ๋ถ์ด ์๋๋ฐ, ๋ฐ๋ก finally ๊ตฌ๋ฌธ์
๋๋ค.

public class DivideExceptionSample {
void finalMessage() {
System.out.println("๊ทธ๋ผ ์๊ณ ํ์ธ์.");
}
public static void main(String[] args) {
DivideExceptionSample sample = new DivideExceptionSample();
int result;
try {
result = 5 / 0;
sample.finalMessage(); // ์ด ์ฝ๋๋ ์คํ๋์ง ์๋๋ค.
} catch (ArithmeticException e) {
result = -1;
System.out.println("์ซ์๋ 0์ผ๋ก ๋๋ ์ ์์ต๋๋ค.");
} finally {
sample.finalMessage(); // ์ด๊ณณ์์๋ ์์ธ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์ํ๋๋ค.
}
}
}
์ ์ฝ๋์์ finally ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋๋ฐ, ์์๋๋ ์ถ๋ ฅ๊ฐ์ด ์ด๋ป๊ฒ ๋ ๊น์? ํ๋ฒ ๊ณ ๋ฏผํด๋ด ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ try๋ฌธ์์ sample.finalMessage(); ๋ ์ ๋๋ก ์คํ๋ ์ ์์ต๋๋ค.
์๋ํ๋ฉด result = 5 / 0;๊ฐ ์คํ๋๋ฉด์ ArithmeticException์ด ๋ฐ์ํ์ฌ catch ๊ตฌ๋ฌธ์ผ๋ก ์์ธ์ฒ๋ฆฌ๊ฐ ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์
๋๋ค.
๋ง์ฝ result = 5 / 0; ์ดํ์ sample.finalMessage(); ๋ฉ์๋๊ฐ ๋ฐ๋์ ์คํ๋์ด์ผ ํ๋ค๋ฉด ์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์๋ฐ์์๋ ์์ ๊ฐ์ด finally๋ฌธ์ ์ฌ์ฉํฉ๋๋ค.
๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
์ซ์๋ 0์ผ๋ก ๋๋ ์ ์์ต๋๋ค.
๊ทธ๋ผ ์๊ณ ํ์ธ์.
๋ค์ ํ๋ฒ ๊ฐ์กฐํ๋ฉด, finally๋ฌธ์ try ๋ฌธ์ฅ ์ํ ์ค ์์ธ ๋ฐ์ ์ฌ๋ถ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์คํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด sample.finalMessage(); ๋ฉ์๋๊ฐ ์ํ๋์ด โ๊ทธ๋ผ ์๊ณ ํ์ธ์โ ๋ผ๋ ๋ฌธ์ฅ์ด ์ถ๋ ฅ๋ฉ๋๋ค.
์์ธ๋ฅผ ์ง์ ์ ์ํด๋ณด๊ณ ์ด๋ป๊ฒ ํ์ฉํ ์ ์์์ง ์์๋ด
์๋ค.
ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ์๋ฐ ํ์ค API์์ ์ ๊ณตํ๋ ์์ธ ํด๋์ค๋ง์ผ๋ก๋ ๋ค์ํ ์ข
๋ฅ์ ์์ธ๋ฅผ ํํํ ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ํ ์
๋ฌด๋ฅผ ์ฒ๋ฆฌํ๋ ํ๋ก๊ทธ๋จ์์ ์๊ณ ๋ณด๋ค ๋ ๋ง์ ์ถ๊ธ ์์ฒญ์ด ๋ค์ด์์ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋๋ฉฐ ํ๋ก๊ทธ๋จ์ ์๊ณ ๋ถ์กฑ ์์ธ๋ฅผ ๋ฐ์์ํฌ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์๊ณ ๋ถ์กฑ ์์ธ๋ ์๋ฐ ํ์ค API์๋ ์กด์ฌํ์ง ์์ต๋๋ค. ์๊ณ ๋ถ์กฑ ์์ธ์ ๊ฐ์ด ์ ํ๋ฆฌ์ผ์ด์
์๋น์ค์ ๊ด๋ จ๋ ์์ธ๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ์ ์ํด์ ๋ง๋ค์ด์ผํ๋ฏ๋ก ์ฌ์ฉ์ ์ ์ ์์ธ๊ฐ ํ์ํฉ๋๋ค.
๊ทธ๋ผ ์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค๋ฅผ ์ด๋ป๊ฒ ์ ์ธํ๋์ง ์ฝ๋๋ฅผ ํ์ธํด๋ด ์๋ค.
public class XXXException extends **Exception** {
public XXXException() { }
public XXXException(String message) { super(message); }
}
or
public class XXXException extends **RuntimeException** {
public XXXException() { }
public XXXException(String message) { super(message); }
}
์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค๋ ์ปดํ์ผ๋ฌ๊ฐ ์ฒดํฌํ๋(CheckedException) ์ผ๋ฐ ์์ธ๋ก ์ ์ธํ ์๋ ์๊ณ , ์ปดํ์ผ๋ฌ๊ฐ ์ฒดํฌํ์ง ์๋(UnCheckedException) ์คํ ์์ธ๋ก ์ ์ธํ ์๋ ์์ต๋๋ค. ์ผ๋ฐ ์์ธ๋ก ์ ์ธํ ๊ฒฝ์ฐ Exception์ ์์ํ๋ฉด ๋๊ณ , ์คํ ์์ธ๋ก ์ ์ธํ ๊ฒฝ์ฐ์๋ RuntimeException์ ์์ํ๋ฉด ๋ฉ๋๋ค.
์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค์ ๋ค์ด๋ฐ๋ Exception์ผ๋ก ๋๋๋ ๊ฒ์ด ์ข์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์ ์ ์ ์์ธ ํด๋์ค๋ ํ๋, ์์ฑ์, ๋ฉ์๋ ์ ์ธ๋ค์ ํฌํจํ ์ ์์ง๋ง ๋๋ถ๋ถ ์์ฑ์ ์ ์ธ๋ง์ ํฌํจํฉ๋๋ค. ์์ฑ์๋ ๋ ๊ฐ๋ฅผ ์ ์ธํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ๋ฐ,
ํ๋๋ ๋งค๊ฐ๋ณ์๊ฐ ์๋ ๊ธฐ๋ณธ ์์ฑ์ ์ด๊ณ ,
public XXXException() { }
๋ค๋ฅธ ํ๋๋ ์์ธ ๋ฐ์ ์์ธ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด String ํ์ ์ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ฐ๋ ์์ฑ์ ์ ๋๋ค.
public XXXException(String message) { super(message); }
String ํ์ ์ ๋งค๊ฐ ๋ณ์๋ฅผ ๊ฐ๋ ์์ฑ์๋ ์์ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ์ฌ ์์ธ ๋ฉ์์ง๋ฅผ ๋๊ฒจ์ค๋๋ค. ์์ธ ๋ฉ์์ง์ ์ฉ๋๋ catch { } ๋ธ๋ก์ ์์ธ ์ฒ๋ฆฌ ์ฝ๋์์ ์ด์ฉํ๊ธฐ ์ํจ์ด์ฃ .
์์ธ ํธ๋์ญ์ ์ฒ๋ฆฌ๋ฒ์ ์์๋ณด๊ธฐ ์ ์, ํธ๋์ญ์ ์ด๋ ๋ฌด์์ธ์ง ์์๋ด ์๋ค.
ํธ๋์ญ์ ์ด๋ ํ๋์ ์์ ๋จ์๋ฅผ ๋ปํ๋๋ฐ, ์๋ฅผ ๋ค์ด ์ํ์์์ โ์ก๊ธโ ํธ๋์ญ์ ์ ๊ฐ์ ํด๋ด ์๋ค. โ์ก๊ธโ ํธ๋์ญ์ ์๋ ๋ค์๊ณผ ๊ฐ์ ์์ ๋ค์ด ์์ต๋๋ค.
์ํ์์์ ์ก๊ธ ํ๋ก์ธ์ค ์ค ํ๋๋ผ๋ ์คํจํ๋ฉด 2๊ฐ์ง ๋ชจ๋ ์ทจ์ํ๊ณ โ์ก๊ธโ ์ ์ ์ํ๋ก ๋๋๋ ค์ผํฉ๋๋ค.
๋ง์ฝ ๋ชจ๋ ์ทจ์ํ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ์ ์ ํฉ์ฑ์ด ํฌ๊ฒ ํ๋ค๋ฆฌ๊ฒ ๋์ฃ . ์ด๋ ๊ฒ ๋ชจ๋ ์ทจ์ํ๋ ํ์๋ฅผ ๋กค๋ฐฑ(rollback)์ด๋ผ๊ณ ํฉ๋๋ค. ์ฌ๊ธฐ์ ๋ฐ์ดํฐ ์ ํฉ์ฑ์ด๋ ๊ฐ๋จํ๊ฒ ๋งํด ๋ฐ์ดํฐ๋ค์ ๊ฐ์ด ์๋ก ์ผ๊ด์ฑ ์๊ฒ ์ผ์นํ๋ ๊ฒ์ ๋งํฉ๋๋ค.
๋_์ก๊ธ() {
์ก๊ธ_์ํ๋ณ๊ฒฝ(์ฒ๋ฆฌ์ค);
์ก๊ธ์ธ_๊ณ์ข_์ถ๊ธ();
์๊ธ์ธ_๊ณ์ข_์
๊ธ();
์ก๊ธ_์ํ๋ณ๊ฒฝ(์๋ฃ);
}
์ก๊ธ_์ํ๋ณ๊ฒฝ(status) {
...
}
์ก๊ธ์ธ_๊ณ์ข_์ถ๊ธ() {
...
}
์๊ธ์ธ_๊ณ์ข_์
๊ธ() {
...
}
๋ค์ ์ ๋ฆฌํ์๋ฉด, ์ํ ์ก๊ธ ํ๋ก์ธ์ค์์ ์ก๊ธ ์ํ๋ณ๊ฒฝ, ์ก๊ธ์ธ ๊ณ์ข ์ถ๊ธ, ์๊ธ์ธ ๊ณ์ข ์ถ๊ธ ์ด๋ผ๋ 3๊ฐ์ง ์์ ์ค ํ๊ฐ์ง๋ผ๋ ์คํจํ๋ฉด ๋ชจ๋ ์์ ์ ์ทจ์ํด์ผํฉ๋๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ์์ธ์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ๋๊ฒ์ด ์ข์๊น์?
๋ค์๊ณผ ๊ฐ์ด ์ก๊ธ ์ํ๋ณ๊ฒฝ, ์ก๊ธ์ธ ๊ณ์ข์ถ๊ธ, ์๊ธ์ธ ๊ณ์ข์ ๊ธ ๋ฉ์๋์์๋ ๊ฐ๊ฐ ์์ธ๋ฅผ ๋์ง๊ณ
๋ ์ก๊ธ ๋ฉ์๋์์ ๋์ ธ์ง ์์ธ๋ฅผ ์ฒ๋ฆฌํ ๋ค ๋ชจ๋ ์ทจ์ํ๋ ๊ฒ์ด ์๋ฒฝํ ํธ๋์ญ์ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ผ๊ฒ๋๋ค.
๋_์ก๊ธ() {
**try {**
์ก๊ธ_์ํ๋ณ๊ฒฝ(์ฒ๋ฆฌ์ค);
์ก๊ธ์ธ_๊ณ์ข_์ถ๊ธ();
์๊ธ์ธ_๊ณ์ข_์
๊ธ();
์ก๊ธ_์ํ๋ณ๊ฒฝ(์๋ฃ);
**} catch (์์ธ) {
๋ชจ๋์ทจ์();
}**
}
์ก๊ธ_์ํ๋ณ๊ฒฝ(status) **throws ์์ธ** {
...
}
์ก๊ธ์ธ_๊ณ์ข_์ถ๊ธ() **throws ์์ธ** {
...
}
์๊ธ์ธ_๊ณ์ข_์
๊ธ() **throws ์์ธ** {
...
}
์ด์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ก๊ธ ์ํ๋ณ๊ฒฝ, ์ก๊ธ์ธ ๊ณ์ข์ถ๊ธ, ์๊ธ์ธ ๊ณ์ข์ ๊ธ ์์ ์ค ํ๋๋ผ๋ ์คํจํ ๊ฒฝ์ฐ ์์ธ๊ฐ ๋ฐ์ํ์ฌ ๊ณ์ข๊ฐ ์ก๊ธ ์์ ์ด ๋ชจ๋ ์ทจ์๋ ๊ฒ ์ ๋๋ค.
์ง๊ธ๊น์ง ์๋ฐ์ ์์ธ ์ฒ๋ฆฌ์ ๋ํด์ ์์๋ณด์์ต๋๋ค. ์ค๋ฌด์์ ์ ๋ง ๋ง์ด ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ , ๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ๋ง๋ ๋์๊ณผ์ , ํ๋ฆ์ ๋ฐ๋ผ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ ์ ํ๊ฒ ํ๋ ๊ฒ๋ ๊ฐ๋ฐ์์ ์ญํ ์ด๋ผ๋ ์๊ฐ์ด ๋ญ๋๋ค.
์๋ฐ 7์์ ์๋กญ๊ฒ ์ถ๊ฐ๋ try-with-resource๋ฅผ ์ฌ์ฉํ๋ฉด ์์ธ ๋ฐ์ ์ฌ๋ถ์ ์๊ด์์ด ์ฌ์ฉํ๋ ๋ฆฌ์์ค ๊ฐ์ฒด(์
์ถ๋ ฅ, ์คํธ๋ฆผ, ์๋ฒ์์ผ, โฆ)์ close() ๋ฉ์๋๋ฅผ ํธ์ถํด์ ์์ ํ๊ฒ ๋ฆฌ์์ค๋ฅผ ๋ซ์์ค๋๋ค. ์ฌ๊ธฐ์ ๋ฆฌ์์ค๋ ๋ค์ํ ์๋ฏธ๊ฐ ๋ ์ ์๋๋ฐ, ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ฐ๋ ๊ฐ์ฒด ๋ผ๊ณ ์ดํด๋ฅผ ํ์๋ฉด ๋ฉ๋๋ค. ์๋ฅผ๋ค์ด ํ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ BufferedReader ๊ฐ์ฒด์ ํ์ผ ๊ฐ์ฒด์ธ FileReader๋ ๋ฆฌ์์ค ๊ฐ์ฒด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค.
๋ค์ ์ฝ๋๋ ์๋ฐ6 ์ด์ ๊น์ง ์ฌ์ฉํ๋, ๋ฆฌ์์ค ๊ฐ์ฒด๋ฅผ ์์ ํ๊ฒ ๋ซ๊ธฐ ์ํ ์ฝ๋์ ๋๋ค.
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class TryWithResourceExample {
public static void main(String[] args) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("file.txt"));
br.readLine();
br.close();
} catch (FileNotFoundException e) {
// FileNotFoundException ๋ฐ์ ์์ธ ์ฒ๋ฆฌ
} catch (IOException e) {
// IOException ๋ฐ์ ์์ธ ์ฒ๋ฆฌ
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
// ์์ธ์ฒ๋ฆฌ
}
}
}
}
}
finally ๋ธ๋ก์์ ๋ค์ try-catch๋ฅผ ์ด๊ณ ์ต์ข
์ ์ผ๋ก BufferedReader ๋ฆฌ์์ค close๋ฅผ ํด์ฃผ์ฃ . close ํ๋ ๊ณผ์ ์์ IOException์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ finally ๋ธ๋ก ์์์๋ try-catch๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ๋ง์ด ๋ณต์กํด๋ณด์
๋๋ค.
๊ทธ๋ผ ์ด๋ถ๋ถ์ ์๋ฐ7์์ ์ถ๊ฐ๋ try-with-resource๊ตฌ๋ฌธ์ ์ฌ์ฉํด์ ๋ฆฌ์์ค close๋ฅผ ํด์ฃผ๊ฒ ์ต๋๋ค.
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"))) {
...
} catch (IOException e) {
// ์์ธ ์ฒ๋ฆฌ
}
์ ๋ง ๊ฐ๋จํด์ง์ฃ ? ์ด๋๋ฅผ ๋ด๋ close()๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํ ๊ณณ์ด ์์ต๋๋ค.
try ๋ธ๋ก์ด ์ ์์ ์ผ๋ก ์คํ์ ์๋ฃํ๊ฑฐ๋ ํน์ ์ค๊ฐ์ ์์ธ๊ฐ ๋ฐ์๋๋ฉด ์๋์ผ๋ก BufferedReader์ close() ๋ฉ์๋๊ฐ ํธ์ถ๋ฉ๋๋ค. try {} ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ฐ์ close()๋ก ๋ฆฌ์์ค๋ฅผ ๋ซ๊ณ , catch ๋ธ๋ก์ ์คํํฉ๋๋ค. ๋ง์ฝ ๋ณต์๊ฐ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํด์ผํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ ์ ์์ต๋๋ค.
try (BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
BufferedWriter writer = new BufferedWriter(new FileWriter("file2.txt"))) {
} catch (IOException e) {
// ์์ธ ์ฒ๋ฆฌ
}
try (FileInputStream inputStream = new FileInputStream("file.txt");
FileOutputStream outputStream = new FileOutputStream("file2.txt")) {
...
} catch (IOException e) {
// ์์ธ ์ฒ๋ฆฌ
}
์ด๋ ๊ฒ ๊ฐ๋จํ ์๋ ๋ฆฌ์์ค ๋ซ๊ธฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋๋ฐ๋ ํ์ํ ์กฐ๊ฑด์ด ์์ต๋๋ค. ๋ฆฌ์์ค ๊ฐ์ฒด๋ java.lang.AutoCloseable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์์ด์ผ ํฉ๋๋ค. AutoCloseable์๋ close() ๋ฉ์๋๊ฐ ์ ์๋์ด ์๋๋ฐ try-with-resources๋ ๋ฐ๋ก ์ด close() ๋ฉ์๋๋ฅผ ์๋ ํธ์ถํฉ๋๋ค.
์๋ฐ API ๋ํ๋จผํธ์์ AutoCloseable ์ธํฐํ์ด์ค๋ฅผ ์ฐพ์์ โAll Known Implementing Classes:โ๋ฅผ ๋ณด๋ฉด try-with-resources์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ๋ฆฌ์์ค๊ฐ ์ด๋ค๊ฒ๋ค์ด ์๋์ง ์ ์ ์์ต๋๋ค.
AutoCloseable ์ธํฐํ์ด์ค์ close() ๋ฉ์๋๋ฅผ ์ง์ ๊ตฌํํ๋ FileInputStream ํด๋์ค๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ TryWithResourceExample ์ฝ๋๋ฅผ ๋ณด๊ณ ์ถ๋ ฅ๊ฒฐ๊ณผ๋ฅผ ํ๋ฒ ์๊ฐํด๋ณด์ธ์.
public class FileInputStream implements AutoCloseable {
private String file;
public FileInputStream(String file) {
this.file = file;
}
public void read() {
System.out.println(file + " ์ ์ฝ์ต๋๋ค");
}
@Override
public void close() throws Exception {
System.out.println(file + "์ ๋ซ์ต๋๋ค");
}
}
public class TryWithResourceExample {
public static void main(String[] args) {
try (FileInputStream fileInputStream = new FileInputStream("file.txt")){
fileInputStream.read();
throw new Exception(); // ๊ฐ์ ์ ์ผ๋ก ์์ธ ๋ฐ์์ํด
} catch (Exception e) {
System.out.println("์์ธ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ์คํ๋์์ต๋๋ค.");
}
}
}
.
.
.
์ถ๋ ฅ๊ฒฐ๊ณผ
file.txt ์ ์ฝ์ต๋๋ค
file.txt์ ๋ซ์ต๋๋ค
์์ธ ์ฒ๋ฆฌ ์ฝ๋๊ฐ ์คํ๋์์ต๋๋ค.