Error & Exception
Error & Exception
๐ ๊ธฐ๋ณธ ๊ฐ๋
ํ๋ก๊ทธ๋จ ์๋ฌ
ํ๋ก๊ทธ๋จ์ด ์คํ ์ค ์ด๋ค ์์ธ์ ์ํด์ ์ค์๋์ ํ๊ฑฐ๋ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ, ๊ทธ ๋ ์์ธ์ ํ๋ก๊ทธ๋จ ์๋ฌ ๋๋ ์ค๋ฅ๋ผ๊ณ ํ๋ค.
ํ๋ก๊ทธ๋จ ์๋ฌ์ ์ข
๋ฅ
์ปดํ์ผ ์๋ฌ(compile-time error)
๋ฐํ์ ์๋ฌ(runtime error)
๋ ผ๋ฆฌ์ ์๋ฌ(logical error)
์ปดํ์ผ๋ ์๋๊ณ ์คํ๋ ์๋์ง๋ง ์๋์ ๋ค๋ฅด๊ฒ ๋์
์: ์ํ ์ฌ๊ณ ๊ฐ ์์๊ฐ ๋จ
์คํ ๋์ค ๋ฐ์ํ๋ ์๋ฌ
์ปดํ์ผ์ ์ ์์ ์ผ๋ก ๋ง์ณ๋ ํ๋ก๊ทธ๋จ ์คํ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ ์ ์๋ค. ์ด๋ฐ ๋ฐํ์ ์๋ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์๋ ํ๋ก๊ทธ๋จ์ ์คํ๋์ค ๋ฐ์ํ ์ ์๋ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ ๋ คํ์ฌ ์ด์ ๋ํ ๋๋น๋ฅผ ํด์ผ ํ๋ค.
์๋ฐ์์ ๋ฐํ์์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ Error์ Exception ๋ ๊ฐ์ง๋ก ๊ตฌ๋ถํ๋ค.
Error - ์๋ฌ
์ผ๋จ ๋ฐ์ํ๋ฉด ๋ณต๊ตฌํ ์ ์๋ ์ฌ๊ฐํ ์ค๋ฅ
์) OutOfMemoryError, StackOverflowError
Exception - ์์ธ
๋ฐ์ํ๋๋ผ๋ ์์ตํ ์ ์๋ ์ ๋. ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ฏธ๋ฆฌ ์ ์ ํ ์ฝ๋๋ฅผ ์์ฑํด๋์ผ๋ฉด ํ๋ก๊ทธ๋จ์ ๋น์ ์์ ์ธ ์ข ๋ฃ๋ฅผ ๋ง์ ์ ์์
Exception๊ณผ Error ํด๋์ค์ ์์ ๊ตฌ์กฐ
์๋ฐ์์ ์คํ ์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ(Exception๊ณผ Error)๋ ๊ฐ์ฒด์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ํด๋์ค์ ์กฐ์์ Object์ด๋ฏ๋ก, Exception๊ณผ Errorํด๋์ค๋ Obejct์ ์์์ด๋ค.
Throwable
ํด๋์ค๋ ๋ชจ๋ ์๋ฌ์ ์์ธ์ superํด๋์ค๋ค. Throwable์ ์์ํ ํ์ ์ด์ฌ์ผ ์๋ฐ์ throw๋ฌธ์์ ๋์ ธ์ง ์ ์๊ณ , catch์ ์ ์ธ์๋ก ์ ๋ฌ๋ ์ ์๋ค. Throwable์ ๋ง๋ค์ด์ก์ ๋ ์ฐ๋ ๋์ execution stack์ ์ค๋ ์ท์ ๊ฐ๊ณ ์์ด StackTrace ์ ๋ณด๋ฅผ ๊ฐ๊ณ ์๋ค.throwable์ ์์ํด์ ์ธ ์๋ ์์ง๋ง ์ฌ์ฉํ์ง ๋ง์.
Error
์์คํ ๋ ๋ฒจ์์ ๋ฐ์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ด๋ป๊ฒ ํ ์ ์๋ ๊ฒ
์
OutOfMemoryError: JVM์ ์ค์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ํ๊ณ ๋ฒ์ด๋จ
ํ ์ฌ์ด์ฆ ๋ถ์กฑ, ๋๋ฌด ๋ง์ class ๋ก๋, ๊ฐ์ฉ๊ฐ๋ฅํ swap์ด ์์ ๋
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด dump ํ์ผ ๋ถ์, jvm ์ต์ ์์ ๋ฑ์ ํ ์ ์๋ค.
Exception
๋ชจ๋ Exception์ ์ต๊ณ ์กฐ์์ Exception ํด๋์ค์ด๋ค.
์์ธ ํด๋์ค๋ ๋ ๋ ๊ฐ์ ๊ทธ๋ฃน์ผ๋ก ๋๋ ์ง ์ ์๋ค.
RuntimeException
ํด๋์ค์ ์์๋คRuntimeException ํด๋์ค์ ์์๋ค์ด ์๋,
Exception
ํด๋์ค์ ์์๋ค
RuntimeException
ํด๋์ค๋ค: Unchecked Excpetion
์ฃผ๋ก ํ๋ก๊ทธ๋๋จธ์ ์ค์์ ์ํด์ ๋ฐ์ ๊ฐ๋ฅ
์
IndexOutOfBoundsException: ์๋ฐ์ ๋ฐฐ์ด ๋ฒ์ ๋ฒ์ด๋จ
NullPointerException: null ์ฐธ์กฐ
ClassCastException: ๋ณํํ ์ ์๋ ํด๋์ค๋ก ๋ณํ
ArithmeticException: ์ ์๋ฅผ 0์ผ๋ก ๋๋
IllegalArgumentException: ์๋ชป๋ ์ธ์ ์ ๋ฌ ์ ๋ฐ์
IllegalStateException: ๊ฐ์ฒด์ ์ํ๊ฐ ๋ฉ์๋ ํธ์ถ์๋ ๋ถ์ ์
UnsupportedOperationException: ๊ฐ์ฒด๊ฐ ์์ฒญ๋ operation์ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ
Unchecked: ์์ธ์ฒ๋ฆฌ๋ฅผ ํ์์ ์ผ๋ก ํ์ง ์์๋ ์ปดํ์ผ ๋๋ค
Error
์ ๊ทธ ์์๋ค๋ Unchecked ์๋ฌ์ด๋ค. try-catch ๋ธ๋ญ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.์๋ฌ๋ ๋ณดํต JVM์ด ์์ ๋ถ์กฑ ๋ฑ ๋ ์ด์ ์ํ์ ๊ณ์ํ ์ ์๋ ์ํฉ์ ๋ํ๋ผ ๋ ์ฌ์ฉํ๋ค. ๋ฐ๋ผ์ Error ํด๋์ค๋ฅผ ์์ํด ํ์ ํด๋์ค๋ฅผ ๋ง๋๋ ์ผ์ ์์ ํ์.
Exception
ํด๋์ค๋ค: Checked Exception
์ฃผ๋ก ์ธ๋ถ์ ์ํฅ, ํ๋ก๊ทธ๋จ ์ฌ์ฉ์์ ๋์์ ์ํด ๋ฐ์
์
IOException
FileNotFoundException
ClassNotFoundException
DataFormatException
Checked: ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฉด ์ปดํ์ผ ๋์ง ์๋๋ค.
Exception Handling
์ ์: ํ๋ก๊ทธ๋จ ์คํ ์ ๋ฐ์ํ ์ ์๋ ์์ธ์ ๋ฐ์์ ๋๋นํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ
๋ชฉ์ : ์์ธ์ ๋ฐ์์ผ๋ก ์ธํ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ๊ฐ์์ค๋ฐ ์ข ๋ฃ๋ฅผ ๋ง๊ณ , ์ ์์ ์ธ ์คํ์ํ๋ฅผ ์ ์งํ ์ ์๋๋ก ํ๋ ๊ฒ
๋ฐ์ํ ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ฉด ํ๋ก๊ทธ๋จ์ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ฉฐ, ์ฒ๋ฆฌ๋์ง ๋ชปํ ์์ธ(uncaugt exception)๋ JVM์ ์์ธ์ฒ๋ฆฌ๊ธฐ(UncaughtExceptionHandler)๊ฐ ๋ฐ์์ ์์ธ์ ์์ธ์ ํ๋ฉด์ ์ถ๋ ฅํ๋ค.
์์ธ ๋ฐ์ ์์ ์ง์ try-catch๋ฌธ์ ์ด์ฉํด ์ฒ๋ฆฌํ๊ฑฐ๋, ์์ธ๋ฅผ ๋์ ธ์ ํธ์ถํ๋ ์ชฝ์ด ์ฑ ์์ ์ง๊ฒ ํ ์ ์๋ค.
try-catch
if๋ฌธ๊ณผ ๋ฌ๋ฆฌ try๋ catch ๋ธ๋ญ ๋ด์ ํฌํจ๋ ๋ฌธ์ฅ์ด ํ๋๋ฟ์ด์ด๋ ๊ดํธ๋ฅผ ์๋ตํ ์ ์๋ค.
if-else์ฒ๋ผ catch ๋ฌธ์ ์ฌ๋ฌ๊ฐ ์ ์ ์ ์๊ณ ์์ธ์ ์ข ๋ฅ์ ์ผ์นํ๋ catch ๋ธ๋ญ์ด ์์ผ๋ฉด ์์ธ๊ฐ ์ฒ๋ฆฌ๋๋ค.
์์ธ๊ฐ ๋ฐ์ํ๋ฉด try ๋ธ๋ญ์์ ๋๋จธ์ง๋ ์คํ๋์ง ์๋๋ค.
์ฒ๋ฆฌ ๊ณผ์
์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋ฐ์ํ ์์ธ์ ํด๋นํ๋ ํด๋์ค์ ์ธ์คํด์ค๊ฐ ๋ง๋ค์ด ์ง๋ค. ๊ทธ๋ฆฌ๊ณ ์์ธ๊ฐ ๋ฐ์ํ ๋ฌธ์ฅ์ด try-catch๋ฌธ์ try๋ธ๋ญ์ ํฌํจ๋์ด ์๋ค๋ฉด ์ด ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ catch๋ธ๋ญ์ด ์๋์ง ์ฐพ๋๋ค.
์ฒซ๋ฒ์งธ catch๋ธ๋ญ๋ถํฐ ๋ด๋ ค๊ฐ๋ฉด์ catch๋ธ๋ญ์ ๊ดํธ๋ด์ ์ ์ธ๋ ์ฐธ์กฐ๋ณ์์ ์ข ๋ฅ์, ์์ฑ๋ ์์ธ ์ธ์คํด์ค์
instanceof
์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๊ฒ์ฌ ๊ฒฐ๊ณผ๊ฐ true๊ฐ ๋์ฌ ๋๊น์ง ๋ฐ๋ณตํ๋ค.๋ชจ๋ ์์ธ๋ Exception ํด๋์ค์ ์์์ด๋ฏ๋ก Exception ํด๋์ค ํ์ ์ ์ฐธ์กฐ ๋ณ์๋ฅผ ์ ์ธํด๋์ผ๋ฉด ์ด๋ค ์์ธ๊ฐ ๋ฐ์ํ๋๋ผ๋ ์ฒ๋ฆฌ๋๋ค.
Method
try-catch ์ ์ ์ฉํ๊ฒ ์ธ ์ ์๋ Exception ๋ฉ์๋๋ค
printStackTrace()
: ์์ธ ๋ฐ์ ๋น์์ Call Stack์ ์์๋ ๋ฉ์๋์ ์ ๋ณด์ ์์ธ ๋ฉ์ธ์ง ์ถ๋ ฅgetMessage()
: ๋ฐ์ํ ์์ธํด๋์ค์ ์ธ์คํด์ค์ ์ ์ฅ๋ ๋ฉ์ธ์ง String ๋ฐํgetStackTrace()
: printStackTrace๋ฅผ ๋ณด์ํ์ฌ StackTraceElement[]๋ผ๋ ๋ฌธ์์ด ๋ฐฐ์ด๋ก ๋ณ๊ฒฝํด์ ์ถ๋ ฅํ๊ณ ์ ์ฅ
๋ฉํฐ catch๋ธ๋ญ
|
๊ธฐํธ๋ฅผ ์ด์ฉํด์ ์ฌ๋ฌ catch ๋ธ๋ญ์ ํ๋๋ก ํฉ์น ์ ์๋ค. (|
๋ ์ฌ๊ธฐ์ ๋
ผ๋ฆฌ ์ฐ์ฐ์๊ฐ ์๋ ๊ธฐํธ์ด๋ค.) ๊ฐ์์๋ ์ ํ์ด ์๋ค.
try {
...
} catch (ExceptionA e | ExceptionB e) {
e.printStackTrace();
}
| ๊ธฐํธ๋ก ์ฐ๊ฒฐ๋ ์์ธ ํด๋์ค๊ฐ ์กฐ์๊ณผ ์์ ๊ด๊ณ๋ผ๋ฉด ์ปดํ์ผ ์๋ฌ. ์กฐ์ ํด๋์ค๋ง ์ ์ด๋ ๋๋ฏ๋ก ๋ถํ์ํ ์ฝ๋๋ผ๋ ์๋ฏธ์ ์๋ฌ๋ค.
์์ธ ๋ฐ์์ํค๊ธฐ throw
throw
throw๋ฅผ ์ฌ์ฉํด์ ๊ณ ์๋ก ์์ธ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
throw new Exception("๋ฉ์ธ์ง");
// ํน์
Exception e = new Exception("๋ฉ์ธ์ง");
throw e;
์ด ๋ ์์ฑ์์ String์ ๋ฃ์ด ์ฃผ๋ฉด, ์ด String์ด Exception ์ธ์คํด์ค์ ๋ฉ์ธ์ง๋ก ์ ์ฅ๋๋ฉฐ, getMessage()
๋ฅผ ํตํด ์ป์ ์ ์๋ค.
๋ฉ์๋์ ์์ธ ์ ์ธ throws
throws
์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ๋ฉ์๋๊ฐ ์ง์ ์ฒ๋ฆฌํ์ง ์๊ณ ํธ์ถํ ๊ณณ์๋ค๊ฐ ์์ธ์ ๋ฐ์ ์ฌ๋ถ๋ฅผ ํต๋ณดํ๋ค.
void method() throws Exception1, Exception2 {
//...
}
์ผ๋ฐ์ ์ผ๋ก ๋ฉ์๋์ ์์ธ ์ ์ธ ์ RuntimeException๋ค์ ์ ์ง ์๋๋ค. ์ ์ด๋ ์๊ด์ ์์ง๋ง ์ฒ๋ฆฌ๋ฅผ ์ํด์ค๋ ๋๋ฏ๋ก ๋ฐ๋์ ์ฒ๋ฆฌํด์ฃผ์ด์ผ ํ๋ ์์ธ๋ง ์ ์ธํ๋ค.
์ด ๋ Checked Exception์ด ๋ฉ์๋์ ์ ์ธ๋ถ์ ๋ช ์๋์ด ์๋ค๋ฉด, ์์ธ๋ฅผ ๋์ง ๊ณ์ธต๋ถํฐ ์ฒ๋ฆฌํ ๊ณ์ธต๊น์ง์ ๋ชจ๋ ๋ฉ์๋์์ ์๊ทธ๋์ฒ๋ฅผ ์์ ํ๊ณ ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํ๋ค.
๋ฉ์๋ ๋ด๋ถ์์ ์ฒ๋ฆฌํด๋ ๋๋ ๊ฑด ์์ฒด์ ์ผ๋ก try-catch๋ก ์ฒ๋ฆฌํ๊ณ , ๋ฉ์๋์ ์ธ์๊ฐ ์๋ชป๋์ด ๋ค์ ๋ฐ์์ผ ํ๋ ๊ฒ ๊ฐ์ด ๋ฉ์๋ ๋ด์์ ์์ฒด์ ์ผ๋ก ํด๊ฒฐ์ด ์๋ ๋ ์์ธ๋ฅผ ๋ฉ์๋์ ์ ์ธํด์ ํธ์ถํ ๋ฉ์๋์์ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์๋ค.
๋ฉ์๋ ๋ด๋ถ์ ํธ์ถํ ์ชฝ์์ ๋ชจ๋ ์ฒ๋ฆฌํด์ผํ ๊ฒฝ์ฐ์, ๋ฉ์๋ ๋ด๋ถ catch๋ธ๋ญ์์ ์ฒ๋ฆฌ ํ ๋ throw๋ฅผ ํ์ฌ ํธ์ถํ ์ชฝ์์๋ ์ฒ๋ฆฌํ๊ฒ ํ ์ ์๋ค. (exception re-throwing)
chained exception
chained exception
ํ ์์ธ๊ฐ ๋ค๋ฅธ ์์ธ๋ฅผ ๋ฐ์์ํฌ ์๋ ์๋ค. ์๋ฅผ ๋ค์ด ์์ธ A๊ฐ ์์ธ B๋ฅผ ๋ฐ์์์ผฐ๋ค๋ฉด A๋ฅผ B์ ์์ธ ์์ธ๋ผ๊ณ ํ๋ค. ์ด ๋ ์์ธ ์์ธ๋ฅผ ์ง์ ํด์ ๋ค๋ฅธ ์์ธ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
try {
} catch (SpaceException e) {
// ์๋ก์ด ์์ธ ์์ฑ
InstallException ie = new InstallException("์ค์น์ค ์์ธ ๋ฐ์");
// ๋ฐ์ํ ์์ธ๋ฅผ ์์ธ ์์ธ๋ก ์ง์ ํ๋ค.
ie.initCause(e);
throw ie;
}
์ด ๋ฐฉ์์ checked์์ธ๋ฅผ unchecked ์์ธ๋ก ๋ฐ๊พธ๊ธฐ ์ํด์๋ ์ฌ์ฉํ ์ ์๋ค.
throw new RuntimeException(new ChecekdException(".."));
์ initCause
๋์ ์ RuntimeException์ ์์ฑ์๋ก Throwable
ํ์
์ ์์ธ์ ๋๊ธธ ์๋ ์๋ค.
์ฌ์ฉ์ ์ ์ ์์ธ
Exception์ด๋ RuntimeException์ ์์ํด์ ์์ธ ํด๋์ค๋ฅผ ๋ง๋ค ์ ์๋ค. ํ์ง๋ง ๊ฐ๋ฅํ๋ฉด ์๋ก์ด ์์ธ ํด๋์ค๋ฅผ ๋ง๋ค๊ธฐ๋ณด๋ค ๊ธฐ์กด์ ์์ธ ํด๋์ค๋ฅผ ํ์ฉํ์.
์ด ๋ Exception์ ์์ํด์ผํ ๊น RuntimeException์ ์์ํด์ผํ ๊น?
Exception์ ์์ํ๋ฉด Checked์์ธ๋ก ๊ผญ ์ฒ๋ฆฌํด์ค์ผ ํ๋ค.
๐ ์์ธ ์ ์ฐ๊ธฐ
try-with-resources
๋ฅผ ์ด์ฉํ์
try-with-resources
๋ฅผ ์ด์ฉํ์์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์๋ close
๋ฅผ ํธ์ถํด ์ง์ ๋ซ์์ค์ผ ํ๋ ์์์ด ๋ง๋ค.
InputStream
,OutputStream
,Connection
๋ฑ
์์์ด ๋ซํ์ ๋ณด์ฅํ๊ธฐ ์ํด try-finally๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค. finally
๋ธ๋ญ์ ์ฌ์ฉํ๋ฉด try-catch ๋ฌธ๊ณผ ํจ๊ป ์์ธ์ ๋ฐ์์ฌ๋ถ์ ์๊ด์์ด ์คํ๋์ด์ผํ ์ฝ๋๋ฅผ ํฌํจ์ํฌ ์ ์๋ค. try๋ catch ๋ธ๋ญ์์ return๋ฌธ์ด ์คํ๋๋๋ผ๋ finally ๋ธ๋ญ์ ์คํ๋๋ค.
ํ์ง๋ง finally๋ฌธ์์๋ ์์ธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
InputStream in = null;
try {
in = new FileInputStream(src);
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} finally {
try {
in.close();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
์ฝ๋๊ฐ ๋ณต์กํด์ ธ์ ๋ณด๊ธฐ ์ข์ง ์๊ณ , ๋ ๋์ ๊ฑด try๋ธ๋ญ๊ณผ finally๋ธ๋ญ์์ ๋ชจ๋ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด try ๋ธ๋ญ์ ์์ธ๊ฐ ๋ฌด์๋๋ค. ๊ทธ๋ผ StackTrace ๋ด์ญ์ ์ฒซ๋ฒ์งธ ์์ธ์ ๋ํ ์ ๋ณด๊ฐ ๋จ์ง ์์ ๋๋ฒ๊น ์ด ์ด๋ ค์ธ ๊ฒ์ด๋ค.
์ด๋ฌํ ์ ์ ๊ฐ์ ํ๊ธฐ ์ํด ์๋ฐ 7์์ try-with-resources
๊ฐ ๋์๋ค.
๊ฐ์ฒด๊ฐ AutoCloseable
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ close()
ํจ์๋ฅผ ๋ง๋ค์ด๋จ๋ค๋ฉด, try-with-resources๋ฌธ์ ์ํด ์๋์ผ๋ก close()๊ฐ ํธ์ถ ๋๋ค.
try( InputStream in = new FileInputStream(src)) {
//...
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
ํจ์ฌ ์ฝ๊ธฐ ์์ํ๊ณ , try ๋ธ๋ญ ๋ด์ close์ ๋ฐ์ํ ์์ธ ์ค์ try ๋ธ๋ญ ๋ด์์ ๋ฐ์ํ ์์ธ๊ฐ ๊ธฐ๋ก๋๋ค. ๋ํ close์ ๋ฐ์ํ ์์ธ๊ฐ ์์ด์ง๋ ๊ฒ ์๋๊ณ ์คํ ์ถ์ ๋ด์ญ์ Suppressed๋ก ๋จ๊ณ , Throwable
์ getSuppressed
๋ฉ์๋๋ฅผ ์ด์ฉํด์ ๊ฐ์ ธ์ฌ ์๋ ์๋ค.
Checked Exception?
์๋ฐ์ ์ ์ -> unchecked ์์ธ๋ฅผ ๋ ์ฌ์ฉํ๋ ์ถ์ธ
๋ฉ์๋์ ์ ์ธ๋ถ์ ์์ธ๋ฅผ ์ ์ธํ๋ฉด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ์ฌ๋์ด ์ ์ธ๋ถ๋ฅผ ๋ณด๊ณ ์ฝ๊ฒ ์์ธกํ ์ ์๋ค. ๊ธฐ์กด์ ์ด๋ค ์ข ๋ฅ์ ์์ธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ง ์ถฉ๋ถํ ์์ธกํ๊ธฐ ํ๋ค์๋ค. ๋ฐ๋ผ์ ์๋ฐ์์ ๋ฉ์๋ ์ ์ธ๋ถ์ ์์ธ๋ฅผ ๋ช ์ํ์ฌ ๋ฉ์๋ caller์๊ฒ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ํ๋ฏ๋ก ํ๋ก๊ทธ๋๋จธ๋ค์ ์ง์ ๋์ด์ฃผ๊ณ , ๋ณด๋ค ๊ฒฌ๊ณ ํ ํ๋ก๊ทธ๋จ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ๋์์ค๋ค.
๊ธฐ์กด์ ์ฃผ๋ก Exception์ ์์๋ฐ์ Checked ์์ธ๋ก ์์ฑํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ง๋ง, ์์ฆ์ ์์ธ์ฒ๋ฆฌ๋ฅผ ์ ํ์ ์ผ๋ก ํ ์ ์๋๋ก RuntimeException์ ์์๋ฐ์ ์์ฑํ๋ ์ชฝ์ผ๋ก ๋ฐ๋์ด๊ฐ๊ณ ์๋ค. Checked ์์ธ๋ ๋ฐ๋์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ์ด์ผ ํ๋ฏ๋ก ์์ธ์ฒ๋ฆฌ๊ฐ ๋ถํ์ํ ๊ฒฝ์ฐ์๋ try-catch๋ฌธ์ ๋ฃ์ด์ ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฐ๊ฐ ์ฒ์ ํ์ํ์ ๋๋ ํ๋ก๊ทธ๋๋ฐ ๊ฒฝํ์ด ์ ์ ์ฌ๋๋ค๋ ๋ณด๋ค ๊ฒฌ๊ณ ํ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์๋๋ก ์์ธ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํ ๊ฒ์ด๋ค. ํ์ง๋ง ์์ฆ์ ์๋ฐ๊ฐ ํ์ํ๋ ์ฝ 20๋ ์ ๊ณผ ๋ง์ด ๋ฌ๋ผ์ก๋ค. ๊ทธ ๋ ์๋ฐ๋ฅผ ์ค๊ณํ๋ ์ฌ๋๋ค์ ์ฃผ๋ก ๊ฐ์ ์ ํ, ๋ฐ์คํฌํ์์ ์คํ๋ ๊ฒ์ด๋ผ ์๊ฐํ์ง๋ง ํ์ฌ๋ ๋ชจ๋ฐ์ผ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ถ์ผ์์ ์ฃผ๋ก ์ฐ์ธ๋ค.
์ด์ฒ๋ผ ํ๋ก๊ทธ๋๋ฐ ํ๊ฒฝ์ด ๋ฌ๋ผ์ง ๋งํผ ํ์์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ๋ง ํ ๊ฒ ๊ฐ์๋ ์์ธ๋ค์ด ์ ํ์ ์ผ๋ก ์ฒ๋ฆฌํด๋ ๋๋ ์ํฉ์ผ๋ก ๋ฐ๋๊ณค ํ๋ค. ๋ฐ๋ผ์ unchecked ์์ธ๊ฐ ๋ ํ์๋ฐ๊ณ ์๋ค.
Oracle Java Documentation -> ํ์ํ ๋ ๊ตฌ๋ถํด์ ์ฐ๊ธฐ
If a client can reasonably be expected to recover from an exception, make it a checked exception. If a client cannot do anything to recover from the exception, make it an unchecked exception.
๋ง์ฝ ํด๋ผ์ด์ธํธ๊ฐ ์์ธ๋ฅผ ๋ณต๊ตฌํ ์ ์๋ค๊ณ ์์๋๋ ๊ฒฝ์ฐ checked exception.
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฌด๊ฒ๋ ํ ์ ์๋ค๋ฉด unchecked exception
๋ง์ฝ ํด๋ผ์ด์ธํธ๊ฐ ์ธ์๋ก ๋๊ฒจ์ค ํ์ผ ์ด๋ฆ์ ์ด์ฉํด์ ์๋ํ๋ ๋ฉ์๋๋ผ๋ฉด, ํ์ผ ์ด๋ฆ์ด ํ๋ ธ์ ๋ Checked Exception์ ๋ฐํํด์ ํด๋ผ์ด์ธํธ์ชฝ์์ ๋ค๋ฅธ ํ์ผ ์ด๋ฆ์ ์ฃผ๊ฑฐ๋, ์๋ง๊ฒ ์ฒ๋ฆฌํ๋๋ก ํ ์ ์๋ค.
ํด๋ฆฐ์ฝ๋: Use Unchecked Exceptions -> Checked๋ ๊ทธ๋ฅ ์ฐ์ง๋ง
Checked Exception์ ์ฌ์ฉํ๋ฉด ์๋๋ ์ด์
์์ด๋ ๊ฒฌ๊ณ ํ๊ฒ ์์ฑ ๊ฐ๋ฅ
์ฒ์ ์๋ฐ์์ checked exception์ด ์๊ฐ๋์ ๋๋ ๊ต์ฅํ ์ข์ ์์ด๋์ด ๊ฐ์๋ค. ๋ฌผ๋ก ์กฐ๊ธ์ ์ด๋์ ์์ ์ ์๋ค. ํ์ง๋ง ์ด์ checked exception์ด ์์ด๋ '๊ฒฌ๊ณ ํ' ์ํํธ์จ์ด๋ฅผ ์์ฑํ ์ ์๋ค๋ ๊ฒ ๋ฐํ์ก๋ค. C#, C++, Python, ์ต์ JVM ์ธ์ด ๋ฑ์ checked exception์ด ์์ง๋ง ๊ฒฌ๊ณ ํ ์ํํธ์จ์ด๋ฅผ ์์ฑํ ์ ์๋ค.
OCP ์์น ์๋ฐฐ & ์บก์ํ ๊นจ์ง
Checked Exception์ OCP ์์น์ ์๋ฐฐํ๋ค. ๋ง์ฝ ๋ฉ์๋์์ checked exception์ throwํ๋ฉด ๊ทธ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ๋ ํธ์ถํ๋ ๋ชจ๋ ๋ฉ์๋์ catch๋ throw๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค. ๋จ์ํ ์ด๋ ๊ฒ ๋ณ๊ฒฝ๋๋ ๊ฒ ๋ฟ ์๋๋ผ, low ๋ ๋ฒจ์์ ์ด๋ค ์์ธ๋ฅผ throwํ๋ ์ง๋ฅผ ์์ ๋ ๋ฒจ๊น์ง ๋ค ์๊ณ ์๋ค๋ ์๋ฏธ๊ฐ ๋๋ฏ๋ก ์บก์ํ๊ฐ ๊นจ์ง๊ฒ ๋๋ค.
์์ฃผ ์ค์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ ๋๋ ์ ์ฉํ ์ ์์ง๋ง ์ผ๋ฐ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์๋ Checked Exception์ผ๋ก ์ธํ ๋น์ฉ์ด ์ด์ต์ ๋ฐ์ด ๋๋๋ค.
์ดํํฐ๋ธ ์๋ฐ -> Checked๋์ ๋น Optional์ ์ด๋จ๊น?
๋ณต๊ตฌํ ์ ์๋ ์ํฉ์ด๋ฉด Checked, ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ผ๋ฉด Unchecked. ํ์คํ์ง ์์ผ๋ฉด Unchecked. Checked ์์ธ๋ผ๋ฉด ๋ณต๊ตฌ์ ํ์ํ ์ ๋ณด๋ฅผ ์๋ ค์ฃผ๋ ๋ฉ์๋๋ ์ ๊ณตํด์ผ ํ๋ค.
Checked ์์ธ๋ฅผ ์ ์ฌ์ฉํ๋ฉด ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ด ๋์์ง์ง๋ง ๋จ์ฉํ๋ฉด ๋ถํธํด์ง๋ค. ๋ํ Checked ์์ธ๋ฅผ ๋ฐ์ํ๋ ๋ฉ์๋๋ stream ์์์ ์ฌ์ฉํ ์๊ฐ ์๋ค. ๋ฐ๋ผ์ ๊ฒ์ฌ ์์ธ๋ฅผ ํํผํด๋ณด์.
๊ฒ์ฌ ์์ธ ๋์ ๋น Optional์ ๋ฐํํ์.
Optional๋ง์ผ๋ก๋ ์ํฉ์ ์ฒ๋ฆฌํ๊ธฐ์ ์ถฉ๋ถํ ์ ๋ณด๋ฅผ ์ ๊ณตํ ์ ์์ ๋๋ง Checked Exception๊ณผ ์ถ๊ฐ ์ ๋ณด๊ฐ ์๋ ๋ฉ์๋๋ ์ ๊ณตํ์.
์ฝํ๋ฆฐ ์ธ ์ก์
์ต์ JVM ์ธ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ฝํ๋ฆฐ์ checked์ unchecked ์์ธ๋ฅผ ๊ตฌ๋ถํ์ง ์๋๋ค.
์ค์ ์๋ฐ ํ๋ก๊ทธ๋๋จธ๋ค์ ์๋ฏธ ์๋ ์์ธ๋ฅผ ๋์ง๊ฑฐ๋ ๊ทธ๋ฅ ๋ฌด์ํ๋ค. ๋ฐ๋ผ์ ์ค์ ๋ก๋ ์ค๋ฅ ๋ฐ์์ ๋ฐฉ์งํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
Stream, Reader ๋ฑ์ closeํ ๋ IOException์ ์ฒดํฌ ์์ธ์ด๋ฏ๋ก ์ก์์ผ ํ๋ค. ํ์ง๋ง ํ๋ก๊ทธ๋๋จธ๊ฐ ํ ์ ์๋ ์ผ์ ์์ผ๋ฏ๋ก ๋๋ถ๋ถ ๋ฌด์ํ๋ค.
๋ฌธ์๋ฅผ ์ซ์๋ก ๋ณ๊ฒฝํ๋ค๊ฑฐ๋ ํ ๋ ๋ฐ์ํ๋ NumberFormatException์ ์ฒดํฌ์์ธ๊ฐ ์๋๋ผ ์ปดํ์ผ๋ฌ๊ฐ ๊ฐ์ ํ์ง ์๋๋ค. ํ์ง๋ง ์ ๋ ฅ๊ฐ์ด ์๋ชป๋๋ ๊ฒฝ์ฐ๋ ํํ ์๋ ์ผ์ด๋ฏ๋ก ์คํ๋ ค ์ด๊ฑธ ์ก์๋ด์ผ ํ๋ค.
๋ฐ๋ผ์ ์ฝํ๋ฆฐ์ ๊ตฌ๋ถํ์ง ์๊ฒ ์ค๊ณ๋์๋ค.
๊ฒฐ๋ก โ๏ธ
Checked ์์ธ๋ ์ต๊ฐํ๋ฉด ์ฐ์ง๋ง๊ณ ์จ์ผํ ๋๋ ๋น Optional์ ์จ๋ณด์. ๊ทธ๋๋ ์จ์ผํ ๋๋ ๋ฉ์๋๋ฅผ ๊ฐ์ด ์ ๊ณตํด์ฃผ์.
์์ธ ํ์ฉ๋ฒ - ์ดํํฐ๋ธ ์๋ฐ
ํ์ค ์์ธ๋ฅผ ์ฌ์ฉํ๋ผ (Item 72)
์์ธ๋ ์ง์ ์ ์ํ๋ ๊ฒ๋ณด๋ค ํ์ค ์์ธ๋ฅผ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
๋ง์ด ์ฌ์ฉ๋๋ ์์ธ๋ค
IllegalArgumentException
: ํธ์ถ์๊ฐ ์ธ์๋ก ๋ถ์ ์ ํ ๊ฐ ๋๊ธธ ๋์: ๋ฐ๋ณต ํ์๋ฅผ ์ง์ ํ๋ ๋งค๊ฐ๋ณ์์ ์์
IllegalStateException
: ๋์ ๊ฐ์ฒด์ ์ํ๊ฐ ํธ์ถํ ๋ฉ์๋๋ฅผ ์ํํ๊ธฐ์ ์ ํฉํ์ง ์์ ๋์: ์ ๋๋ก ์ด๊ธฐํ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ค ํจ
๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์ ๋๊ฐ๋ก ํ์น ์๋ ์์ง๋ง ํน์ํ ์ํฉ์์๋ ํด๋นํ๋ ์์ธ๋ฅผ ์ฌ์ฉํ์.
null์ ํ์ฉํ์ง ์๋๋ฐ null ๊ฐ์ ๊ฑด๋ธ๋ค -> IllegalArgumentException๋ณด๋ค๋ NPE
์ด๋ค ์ํ์ค์ ํ์ฉ ๋ฒ์๋ฅผ ๋๋ ๊ฐ -> IndexOutOfBoundsException
UnsupportedOperationException
: ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ ๋์์ ๋์ ๊ฐ์ฒด๊ฐ ์ง์ํ์ง ์์ ๋. ๋ณดํต ๊ฐ์ฒด๋ ์์ ์ด ์ ์ํ ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ง์ํ๋ ํํ์ง ์๋ค. ๋ณดํต์ ๊ตฌํํ๋ ค๋ ์ธํฐํ์ด์ค์ ๋ฉ์๋ ์ผ๋ถ๋ฅผ ๊ตฌํํ ์ ์์ ๋ ์ด๋ค.์: ์์๋ฅผ ๋ฃ์ ์๋ง ์๋ List ๊ตฌํ์ฒด์ ๋๊ฐ remove ๋ฉ์๋ ํธ์ถ
์ถ์ํ ์์ค์ ๋ง๋ ์์ธ๋ฅผ ๋์ ธ๋ผ (Item 73)
์ํํ๋ ค๋ ์ผ๊ณผ ๊ด๋ จ ์์ด ๋ณด์ด๋ ์์ธ๊ฐ ํ์ด๋์ค๋ฉด ๋นํฉ์ค๋ฌ์ธ ๊ฒ์ด๋ค. ์ด๋ ๋ฉ์๋๊ฐ ์ ์์ค ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ง ์๊ณ ๋ฐ๊นฅ์ผ๋ก ์ ํํด๋ฒ๋ฆด ๋ ์ข ์ข ์ผ์ด๋๋ค. ์ด๋ ๋ด๋ถ ๊ตฌํ ๋ฐฉ์์ ๋๋ฌ๋ด์ด ์ ๋ ๋ฒจ API๋ฅผ ์ค์ผ์ํจ๋ค.
์ด ๋ฌธ์ ๋ฅผ ํผํ๋ ค๋ฉด ์์ ๊ณ์ธต์์๋ ์ ์์ค ์์ธ๋ฅผ ์ก์ ์์ ์ ์ถ์ํ ์์ค์ ๋ง๋ ์์ธ๋ก ๋ฐ๊ฟ ๋์ ธ์ผ ํ๋ค. -> ์์ธ ๋ฒ์ญ(exception translation)
๊ทธ๋ฆฌ๊ณ ์ ์์ค ์์ธ๊ฐ ๋๋ฒ๊น ์ ๋์์ด ๋๋ค๋ฉด exception chaining์ ์ฌ์ฉํ์. ๊ทธ๋ผ Throwable์ getCausea ๋ฉ์๋๋ฅผ ํตํด ํ์ํ๋ฉด ์ ์์ค ์์ธ๋ฅผ ๊บผ๋ด๋ณผ ์ ์๋ค.
๊ทธ๋ ๋ค๊ณ ์์ธ ๋ฒ์ญ์ ๋จ์ฉํด์ ์๋๋ค. ๊ฐ๋ฅํ๋ฉด ์ ์์ค ๋ฉ์๋๊ฐ ๋ฐ๋์ ์ฑ๊ณตํ๋๋ก ํด์ ์๋ ๊ณ์ธต์์ ์์ธ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํ์.
์์ ๊ณ์ธต ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ์๋ ๊ณ์ธต ๋ฉ์๋๋ก ๊ฑด๋ค๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ๊ฒ์ฌํ๋ ๊ฒ๋ ์ข๋ค.
์์ธ๋ฅผ ๋ฌด์ํ์ง ๋ง๋ผ (Item 77)
try๋ฌธ์ผ๋ก ๊ฐ์ผ ํ catch ๋ธ๋ก์์ ์๋ฌด๊ฒ๋ ํ์ง ์๋ ๊ฒ ์์ธ๋ฅผ ๋ฌด์ํ๋ ๊ฒ์ด๋ค. ๋ง์ฝ ์์ธ๋ฅผ ๋ฌด์ํ ํ์๊ฐ ์๋ค๋ฉด (Stream์ ๋ซ์ ๋์ฒ๋ผ) catch ๋ธ๋ก ์์ ๊ทธ๋ ๊ฒ ๊ฒฐ์ ํ ์ด์ ๋ฅผ ์ฃผ์์ผ๋ก ๋จ๊ธฐ๊ณ ์์ธ ๋ณ์์ ์ด๋ฆ์ ignored๋ก ์ฌ์ฉํ์.
try {
//..
} catch (FirstException | SecondException ignored) {
//์ด์ฉ๊ตฌ์ ์ฉ๊ตฌ
}
Last updated