1. try-with-resources๋ฌธ โณ
try (SomeResource resource = getResource()) {
use(resource);
} catch(Exception e) {
...
}
JDK1.7๋ถํฐ try-with-resources๋ฌธ์ด ์ถ๊ฐ๋์๋ค. try-with-resources๋ฌธ์ ๊ดํธ() ์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฌธ์ฅ์ ๋ฃ์ผ๋ฉด, ์ด ๊ฐ์ฒด๋ ๋ฐ๋ก close()๋ฅผ ํธ์ถํ์ง ์์๋ try๋ธ๋ญ์ ๋ฒ์ด๋๋ ์๊ฐ ์๋์ ์ผ๋ก close()๊ฐ ํธ์ถ๋๋ค. ๊ทธ๋ฆฌ๊ณ catch๋ธ๋ญ ๋๋ finally๋ธ๋ญ์ด ๋ฐ๋ผ์ค๊ฒ ๋๋ค.
์ด๋ try-with-resources๋ฅผ ํตํด ์๋์ผ๋ก ๊ฐ์ฒด์ close()๊ฐ ํธ์ถ๋ ์ ์์ผ๋ ค๋ฉด ํด๋์ค๊ฐ AutoCloseable์ด๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒ์ด์ด์ผ ํ๋ค. ๋ํ, ์๋์ ๊ฐ์ด ๋ณต์์ ์์ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ์๋ ์๋ค.
try (Something1 s1 = new Something1();
Something2 s2 = new Something2()) {
use(resource);
} catch(Exception e) {
...
}
try-with-resources์ ์ฅ์ ์ ๊ดํ ์์ธํ ๋ด์ฉ์ ๋งํฌ๋ ๊ธ์ ์ฐธ์กฐํ๊ธฐ ๋ฐ๋๋ค.
2. ์ฌ์ฉ์์ ์ ์์ธ ๐ณ
๊ธฐ์กด์ ์ ์๋ ์์ธ ํด๋์ค ์ธ์ ํ์์ ๋ฐ๋ผ ํ๋ก๊ทธ๋๋จธ๊ฐ ์๋ก์ด ์์ธ ํด๋์ค๋ฅผ ์ ์ํ์ฌ ์ฌ์ฉํ ์ ์๋ค. (๊ฐ๋ฅํ๋ฉด ์๋ก์ด ์์ธ ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ๋ณด๋ค ๊ธฐ์กด์ ์์ธํด๋์ค๋ฅผ ์ฌ์ฉํ๋๋ก ํ์.)
// ์ฌ์ฉ์์ ์ ์์ธ ์์ฑ ์์
class MyException extends Exception {
MyException(String msg) {
super(msg + "์ ์กด์ฌํ์ง ์์ต๋๋ค.");
}
}
3. ์ฐ๊ฒฐ๋ ์์ธ(Chained Exception) ๐ฅ
ํ ์์ธ๊ฐ ๋ค๋ฅธ ์์ธ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค. A๊ฐ ์์ธ B๋ฅผ ๋ฐ์์ํจ๋ค๋ฉด A๋ฅผ B์ '์์ธ ์์ธ(cause exception)'๋ผ๊ณ ํ๋ค. ์ฌ์ฉ ๋ฐฉ๋ฒ์ B๋ฅผ ์์ฑํ ํ, initCause()๋ก A๋ฅผ B์ ์์ธ ์์ธ๋ก ๋ฑ๋กํ๋ค. ๊ทธ๋ฆฌ๊ณ 'throw'๋ก ์์ธ๋ฅผ ๋์ง๋ค.
try {
} catch (AException e) {
B b = new B("์์ธ ๋ฐ์");
b.initCause(e);
throw b;
}
์ง๊ธ๊น์ง ํด์๋ ๊ฒ์ฒ๋ผ ๋ฐ์ํ ์์ธ๋ฅผ ๊ทธ๋ฅ ์ฒ๋ฆฌํ๋ฉด ๋ ํ ๋ฐ ์ ์ด๋ ๊ฒ ํ ๊น? ๊ทธ ์ด์ ๋ ์ฌ๋ฌ ๊ฐ์ง ์์ธ๋ฅผ ํ๋์ ํฐ ๋ถ๋ฅ์ ์์ธ๋ก ๋ฌถ์ด์ ๋ค๋ฃจ๊ธฐ ์ํจ์ด๋ค. ๋ฌผ๋ก ์ฌ๋ฌ ๊ฐ์ง ์์ธ์ ๊ณตํต ์กฐ์ํด๋์ค๋ฅผ ์ฌ์ฉํ ์๋ ์๊ฒ ์ง๋ง, ์ด๋ ์ค์ ๋ก ์ด๋ค ์์ธ๊ฐ ๋ฐ์ํ ๊ฒ์ธ์ง ์ ์ ์๋ค๋ ๋ฌธ์ ์ ์์๊ด๊ณ๋ฅผ ์ค์ ํด์ค์ผ ํ๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค.
try {
throw new ChildException1();
throw new ChildException2();
} catch (ParentException e) {
... // ์ด๋ค ์์์ ์์ธ์ธ์ง ํ์ธํ ์ ์๋ค.
}
์ด๋ ์์ธ๊ฐ ์์ธ ์์ธ๋ฅผ ํฌํจํ ์ ์๊ฒ ํ๋ค๋ฉด ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ค.
public static void main(String args[]) {
try {
method();
} catch (ParentException e) {
e.printStackTrace();
}
}
static void method() throws ChildException1, ChildException2 {
try {
checkSeat();
} catch(ChildException1 e) {
ParentException pe = new ParentException("ParentException ๋ฐ์");
ie.initCause(e);
throw e;
} catch(ChildException2 e) {
ParentException pe = new ParentException("ParentException ๋ฐ์");
ie.initCause(e);
throw e;
}
}
static void checkSeat() throws ChildException1, ChildException2 {
if(!isChild1Seat(){
throw new ChildException1("Child1์ ์๋ฆฌ๊ฐ ์๋");
}
if(!isChild2Seat(){
throw new ChildException2("Child2์ ์๋ฆฌ๊ฐ ์๋");
}
}
// 'ParentException ๋ฐ์'์ผ๋ก ํฐ ๋ถ๋ฅ์ ์์ธ๋ฅผ ๋ฌถ์ ์ ์๊ณ
// 'Child1์ ์๋ฆฌ๊ฐ ์๋'๊ณผ 'Child2์ ์๋ฆฌ๊ฐ ์๋'์ ํตํด ์ค์ ๋ฐ์ํ ์์ธ๊ฐ ์ด๋ค ๊ฒ์ธ์ง ์ ์ ์๋ค.
// ChildException1๊ณผ ChildException2์ ์์๊ด๊ณ๋ ๋ณ๊ฒฝํ์ง ์์๋ ๋๋ค.
์ฐ๊ฒฐ๋ ์์ธ(Chained Exception)์ ๋ ๋ค๋ฅธ ์ฅ์ ์ผ๋ก๋ checked์์ธ๋ฅผ unchecked์์ธ๋ก ๋ฐ๊ฟ ์ ์๋ค๋ ๊ฒ์ด๋ค.
static void method() throws MemoryException {
if(!enoughMemory())
throw new MemoryException("๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ");
}
์์ ์ฝ๋์์ method()๋ฅผ ์ฌ์ฉํ๋ค๋ฉด checkedException์ธ MemoryException์ ์ฒ๋ฆฌํ๊ธฐ ์ํด์ try-catch๋ฌธ์ ์ฌ์ฉํด์ผ ํ๋ค.
static void method() {
if(!enoughMemory())
throw new RuntimeException(new MemoryException("๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ"));
}
ํ์ง๋ง ์์ ๊ฐ์ด MemoryException์ RuntimeException์ผ๋ก ๊ฐ์ธ์ฃผ๋ฉด unchecked์์ธ๊ฐ ๋๊ณ , ๊ทธ๋์ throws MemoryException์ ํด์ฃผ์ง ์์๋ ๋๋ค. (RuntimeException์ ์์ฑ์๋ฅผ initCause() ๋์ ์ฌ์ฉํ์๋ค.)
ํด๋น ๊ธ์ ๋จ๊ถ ์ฑ๋์ Java์ ์ ์์ ์ฝ๊ณ ์์ฑํ ๊ฒ์ ๋๋ค.
'๐ JAVA > ์ฃผ์ ๊ฐ๋ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ์ถ๋ ฅ(I/O)(1) - ๋ ธ๋ ์คํธ๋ฆผ, ๋ณด์กฐ ์คํธ๋ฆผ (0) | 2023.01.29 |
---|---|
๋๋ค์(Lambda Expression) - (2) (0) | 2023.01.29 |
๋๋ค์(Lambda Expression) - (1) (0) | 2023.01.29 |
Comparable๊ณผ Comparator (0) | 2023.01.28 |
์์ธ์ฒ๋ฆฌ(Exception Handling) - (1) (0) | 2023.01.28 |