# Error & Exception
# Goal
- Error์ Exception์ ์ฐจ์ด์ ์ ๋ํด ์ค๋ช ํ ์ ์๋ค.
- Exception Handling์ ํ ์ ์๋ค.
# Abstract
Error์ Exception์ ๊ฐ๋ค๊ณ ์๊ฐํ ์๋ ์์ง๋ง ์ฌ์ค ํฐ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
Error ๋ ์ปดํ์ผ ์ ๋ฌธ๋ฒ์ ์ธ ์ค๋ฅ์ ๋ฐํ์ ์ ๋ํฌ์ธํธ ์ฐธ์กฐ์ ๊ฐ์ ์ค๋ฅ๋ก ํ๋ก์ธ์ค์ ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐ ์์ผ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃ ์ํฌ ์ ์์ต๋๋ค.
Exception ์ ์ปดํจํฐ ์์คํ ์ ๋์ ๋์ค ์๊ธฐ์น ์์๋ ์ด์ ์ํ๊ฐ ๋ฐ์ํ์ฌ ์ํ ์ค์ธ ํ๋ก๊ทธ๋จ์ด ์ํฅ์ ๋ฐ๋ ๊ฒ์ฐ๋ก ์๋ฅผ ๋ค๋ฉด, ์ฐ์ฐ ๋์ค ๋์นจ์ ์ํด ๋ฐ์ํ ๋ผ์ด๋ค๊ธฐ ๋ฑ์ด ์ด์ ํด๋นํฉ๋๋ค.
ํ๋ก๊ทธ๋จ์ด ์คํ ์ค ์ด๋ค ์์ธ์ ์ํด์ ์ค์๋์ ํ๊ฑฐ๋ ๋น์ ์์ ์ผ๋ก ์ข ๋ฃ๋๋ ๊ฒฝ์ฐ๋ฅผ ํ๋ก๊ทธ๋จ ์ค๋ฅ๋ผ ํ๊ณ , ํ๋ก๊ทธ๋จ ์ค๋ฅ์๋ ์๋ฌ(error)์ ์์ธ(exception) ๋ ๊ฐ์ง๋ก ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ์๋ฌ๋ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ด๋ ์คํ์ค๋ฒํ๋ก์ฐ์ ๊ฐ์ด ๋ฐ์ํ๋ฉด ๋ณต๊ตฌํ ์ ์๋ ์ฌ๊ฐํ ์ค๋ฅ์ด๊ณ , ์์ธ๋ ๋ฐ์ํ๋๋ผ๋ ์์ตํ ์ ์๋ ๋น๊ต์ ๋ ์ฌ๊ฐํ ์ค๋ฅ์ ๋๋ค. ์ด ์์ธ๋ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ ์ ํ ์ฝ๋๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋น์ ์์ ์ธ ์ข ๋ฅ๋ฅผ ๋ง์ ์ ์์ต๋๋ค.
Error์ ์ํฉ์ ๋ฏธ๋ฆฌ ๋ฏธ์ฐ์ ๋ฐฉ์งํ๊ธฐ ์ํด์ Exception ์ํฉ์ ๋ง๋ค ์ ์์ผ๋ฉฐ, java์์๋ try-catch๋ฌธ์ผ๋ก Exception handling์ ํ ์ ์์ต๋๋ค.
# Exception Handling
์๋ชป๋ ํ๋๋ก ์ธํด ์ ์ฒด ์์คํ ์ด ๋ฌด๋์ง๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ๊ธฐ์ ์ ์ธ ์ฒ๋ฆฌ์ ๋๋ค. JAVA์์๋ ์์ธ์ ์๋ฌ๋ ๊ฐ์ฒด๋ก ์ฒ๋ฆฌํฉ๋๋ค.
# ์์ธ๊ฐ ์ฃผ๋ก ๋ฐ์ํ๋ ์์ธ
- ์ฌ์ฉ์์ ์๋ชป๋ ๋ฐ์ดํฐ ์ ๋ ฅ
- ์๋ชป๋ ์ฐ์ฐ
- ๊ฐ๋ฐ์๊ฐ ๋ก์ง์ ์๋ชป ์์ฑ
- ํ๋์จ์ด, ๋คํธ์ํฌ ์ค์๋
- ์์คํ ๊ณผ๋ถํ
# Throwable ํด๋์ค
Throwable ํด๋์ค๋ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ ์ต์์ ํด๋์ค์ ๋๋ค. Exception๊ณผ Error๋ Throwable์ ์์์ ๋ฐ์ต๋๋ค.
# Error (์๋ฌ)
Error๋ ์์คํ ๋ ๋ฒจ์์ ๋ฐ์ํ์ฌ, ๊ฐ๋ฐ์๊ฐ ์ด๋ป๊ฒ ์กฐ์นํ ์ ์๋ ์์ค์ ์๋ฏธํฉ๋๋ค.
- OutOfMemoryError : JVM์ ์ค์ ๋ ๋ฉ๋ชจ๋ฆฌ์ ํ๊ณ๋ฅผ ๋ฒ์ด๋ ์ํฉ์ผ ๋ ๋ฐ์ํฉ๋๋ค. ํ ์ฌ์ด์ฆ๊ฐ ๋ถ์กฑํ๊ฑฐ๋, ๋๋ฌด ๋ง์ class๋ฅผ ๋ก๋ํ ๋, ๊ฐ์ฉ๊ฐ๋ฅํ swap์ด ์์๋, ํฐ ๋ฉ๋ชจ๋ฆฌ์ native๋ฉ์๋๊ฐ ํธ์ถ๋ ๋ ๋ฑ์ด ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ์ํด dump ํ์ผ๋ถ์, jvm ์ต์ ์์ ๋ฑ์ด ์์ต๋๋ค.
# Exception (์์ธ)
์์ธ๋ ๊ฐ๋ฐ์๊ฐ ๊ตฌํํ ๋ก์ง์์ ๋ฐ์ํ๋ฉฐ ๊ฐ๋ฐ์๊ฐ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๊ฐ๋ฅํ ๊ฒ๋ค๋ก JVM์ ์ ์ ๋์ํฉ๋๋ค.
# Exception์ 2๊ฐ์ง ์ข ๋ฅ
Checked Exception : ์์ธ์ฒ๋ฆฌ๊ฐ ํ์์ด๋ฉฐ, ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ปดํ์ผ๋์ง ์์ต๋๋ค. JVM ์ธ๋ถ์ ํต์ (๋คํธ์ํฌ, ํ์ผ์์คํ ๋ฑ)ํ ๋ ์ฃผ๋ก ์ฐ์ ๋๋ค.
RuntimeException ์ด์ธ์ ์๋ ๋ชจ๋ ์์ธ
IOException, SQLException ๋ฑ
Unchecked Exception : ์ปดํ์ผ ๋ ์ฒดํฌ๋์ง ์๊ณ , Runtime์ ๋ฐ์ํ๋ Exception์ ๋งํฉ๋๋ค.
RuntimeException ํ์์ ๋ชจ๋ ์์ธ
NullPointerException, IndexOutOfBoundException ๋ฑ
# ๋ํ์ ์ธ Exception Class
NullPointerException
: Null ๋ ํผ๋ฐ์ค๋ฅผ ์ฐธ์กฐํ ๋ ๋ฐ์, ๋ญ๊ฐ ๋์์ํฌ ๋ ๋ฐ์ํฉ๋๋ค.IndexOutOfBoundsException
: ๋ฐฐ์ด๊ณผ ์ ์ฌํ ์๋ฃ๊ตฌ์กฐ(๋ฌธ์์ด, ๋ฐฐ์ด, ์๋ฃ๊ตฌ์กฐ)์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ธ๋ฑ์ค ๋ฒํธ ์ฌ์ฉ์ผ๋ก ๋ฐ์ํฉ๋๋ค.FormatException
: ๋ฌธ์์ด, ์ซ์, ๋ ์ง ๋ณํ ์ ์๋ชป๋ ๋ฐ์ดํฐ(ex. "123A" -> 123 ์ผ๋ก ๋ณํ ์)๋ก ๋ฐ์ํ๋ฉฐ, ๋ณดํต ์ฌ์ฉ์์ ์ ๋ ฅ, ์ธ๋ถ ๋ฐ์ดํฐ ๋ก๋ฉ, ๊ฒฐ๊ณผ ๋ฐ์ดํฐ์ ๋ณํ ์ฒ๋ฆฌ์์ ์์ฃผ ๋ฐ์ํฉ๋๋ค.ArthmeticException
: ์ ์๋ฅผ 0์ผ๋ก ๋๋๋ ๋ฐ์ํฉ๋๋ค.ClassCastException
: ๋ณํํ ์ ์๋ ํ์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ๋ณํํ ๋ ๋ฐ์ํฉ๋๋ค.IllegalArgumentException
: ์๋ชป๋ ์ธ์ ์ ๋ฌ ์ ๋ฐ์ํฉ๋๋ค.IOException
: ์ ์ถ๋ ฅ ๋์ ์คํจ ๋๋ ์ธํฐ๋ฝํธ ์ ๋ฐ์ํฉ๋๋ค.IllegalStateException
: ๊ฐ์ฒด์ ์ํ๊ฐ ๋งค์๋ ํธ์ถ์๋ ๋ถ์ ์ ํ ๊ฒฝ์ฐ์ ๋ฐ์ํฉ๋๋ค.ConcurrentModificationException
: ๊ธ์ง๋ ๊ณณ์์ ๊ฐ์ฒด๋ฅผ ๋์์ ์์ ํ๋๊ฒ์ด ๊ฐ์ง๋ ๊ฒฝ์ฐ ๋ฐ์ํฉ๋๋ค.UnsupportedOperationException
: ๊ฐ์ฒด๊ฐ ๋ฉ์๋๋ฅผ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ ๋ฐ์ํฉ๋๋ค.
# ์ฃผ์ Method
printStackTrace()
: ๋ฐ์ํ Exception์ ์ถ์ฒ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์์ ์ถ์ ํ๋ฉด์ ๊ฒฐ๊ณผ๋ฅผ ์๋ ค์ค๋๋ค. ๋ฐ์ํ ์์น๋ฅผ ์ ํํ ์ถ๋ ฅํด์ค์ ์ ์ผ ๋ง์ด ์ฐ๋ฉฐ void๋ฅผ ๋ฐํํฉ๋๋ค.getMessage()
: ํ์ค๋ก ์์ฝ๋ ๋ฉ์ธ์ง๋ฅผ String์ผ๋ก ๋ฐํํด์ค๋๋ค.getStackTrace()
: jdk1.4 ๋ถํฐ ์ง์, printStackTrace()๋ฅผ ๋ณด์, StackTraceElement[] ์ด๋ผ๋ ๋ฌธ์์ด ๋ฐฐ์ด๋ก ๋ณ๊ฒฝํด์ ์ถ๋ ฅํ๊ณ ์ ์ฅํฉ๋๋ค.
# Exception Handling
JAVA์์ ๋ชจ๋ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด (XXX)Exception ๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค. ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ 2๊ฐ์ง๊ฐ ์์ต๋๋ค.
์ง์
try ~ catch
๋ฅผ ์ด์ฉํด์ ์์ธ์ ๋ํ ์ต์ข ์ ์ธ ์ฑ ์์ ์ง๊ณ ์ฒ๋ฆฌํ๋ ๋ฐฉ์throws Exception ์ ์ด์ฉํด์ ๋ฐ์ํ ์์ธ์ ์ฑ ์์ ํธ์ถํ๋ ์ชฝ์ด ์ฑ ์์ง๋๋ก ํ๋ ๋ฐฉ์ (์ฃผ๋ก ํธ์ถํ๋ ์ชฝ์ ์์ธ๋ฅผ ๋ณด๊ณ ํ ๋ ์ฌ์ฉํฉ๋๋ค.)
๋ค๋ฅธ ๋ฉ์๋์ ์ผ๋ถ๋ถ์ผ๋ก ๋์ํ๋ ๊ฒฝ์ฐ์ ๋์ง๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
# ์์ธ ์ก๊ธฐ (try ~ catch ๊ตฌ๋ฌธ)
๋ก์ง ์ค์ ์์ธ๊ฐ ๋ฐ์ํ ์ง๋ ๋ชจ๋ฅด๋ ๋ถ๋ถ์ try ~ catch ๊ตฌ๋ฌธ์ผ๋ก ๋ณดํ ์ฒ๋ฆฌํฉ๋๋ค.
try
์๋ ์ํํ ๋ก์ง์ด ๋ค์ด๊ฐ๊ณ ,catch
์๋ ์์ธ ๋ฐ์ ์ ์ํํ ๋ก์ง์ด ๋ค์ด๊ฐ๋๋ค.try
์ค์ด๋ผ๋ ์์ธ๊ฐ ๋ฐ์ํ ๋ค์์ ์ฝ๋๋ค์ ์คํ๋์ง ์์ผ๋ฉฐcatch
๊ตฌ๋ฌธ์ผ๋ก ๋์ด๊ฐ๋๋ค.catch
๊ตฌ๋ฌธ์else if
์ฒ๋ผ ์ฌ๋ฌ๊ฐ ์ธ ์ ์์ต๋๋ค.finally
๋ ๋ง์ง๋ง์ ์คํํ๊ณ ์ถ์ ๋ก์ง์ด ๋ค์ด๊ฐ๋ฉฐ, ๋ํ์ ์ผ๋ก.close()
๊ฐ ์์ต๋๋ค.
# ์์ธ ๋์ง๊ธฐ (throws ๊ตฌ๋ฌธ)
์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ฌ ๋ฉ์๋๊ฐ ์ง์ ์ฒ๋ฆฌํ์ง ์๊ณ ํธ์ถํ ๊ณณ์๋ค๊ฐ ์์ธ์ ๋ฐ์ ์ฌ๋ถ๋ฅผ ํต๋ณดํฉ๋๋ค. ํธ์ถํ ๋ฉ์๋๋ ์ด๊ฑธ ๋ ๋์ง๊ฑด์ง ์ง์ ์ฒ๋ฆฌํ ๊ฑด์ง ์ ํด์ผํฉ๋๋ค. (return๋ณด๋ค ๊ฐ๋ ฅํฉ๋๋ค.)
public class ThrowsEx {
public void call_A() throws Exception {
call_B();
}
private void call_B() throws Exception {
call_C();
}
private void call_C() throws Exception {
System.out.println(1 / 0);
}
public static void main(String[] args) throws Exception {
ThrowsEx test = new ThrowsEx();
test.call_A();
}
}
์คํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ์ต๋๋ค.
Exception in thread "main" java.lang.ArithmeticException: / by zero
at exception.ThrowsEx.call_C(ThrowsEx.java:13)
at exception.ThrowsEx.call_B(ThrowsEx.java:9)
at exception.ThrowsEx.call_A(ThrowsEx.java:5)
at exception.ThrowsEx.main(ThrowsEx.java:18)