๐น ์์ธ(Exception)๋ ?
- ํ๋ก๊ทธ๋จ ์คํ ์ค ์์์น ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์ํฉ์ ์๋ฏธํ๋ค.
- ์ด๋ ์ ์์ ์ธ ๋ช ๋ น ํ๋ฆ์ ๋ฐฉํดํ๋ ๋ฐํ์ ์ค๋ฅ์ด๋ฉฐ, ๋จ์ํ ๋ฌธ๋ฒ ์ค๋ฅ(Syntax Error)์๋ ๋ค๋ฅด๋ค.
[ ์์ธ๊ฐ ๋ฐ์ํ๋ ๋ํ์ ์ธ ์ฌ๋ก ]
- 0์ผ๋ก ๋๋๊ธฐ → ArithmeticException
- ๋ฐฐ์ด์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ ๊ทผ → ArrayIndexOutOfBoundsException
- ์๋ชป๋ ๊ฐ์ฒด ์ฐธ์กฐ (Null ๊ฐ ์ฐธ์กฐ) → NullPointerException
๐น ์์ธ ์ฒ๋ฆฌ(Exception Handling)๋ ?
- ์์ธ๊ฐ ๋ฐ์ํ์ ๋, ํ๋ก๊ทธ๋จ์ด ๊ฐ์๊ธฐ ์ข ๋ฃ๋์ง ์๋๋ก ํ๊ณ , ์ ์ ํ ๋์ฒ๋ฅผ ํตํด ์ ์์ ์ธ ํ๋ฆ์ ์ ์งํ๋ ๋ฐฉ๋ฒ์ด๋ค.
[ ์์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ์ด์ ]
- ํ๋ก๊ทธ๋จ์ ์์ ์ฑ ์ ์ง (๊ฐ์์ค๋ฌ์ด ์ข ๋ฃ ๋ฐฉ์ง)
- ์ค๋ฅ์ ์์ธ ํ์ ๋ฐ ๋์ ๊ฐ๋ฅ
- ์ฌ์ฉ์์๊ฒ ์ ์ ํ ํผ๋๋ฐฑ ์ ๊ณต
๐ธ ์์ธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
โฝ try-catch ๋ธ๋ก ์ฌ์ฉ
try {
int result = 10 / 0; // ์์ธ ๋ฐ์ (ArithmeticException)
} catch (ArithmeticException e) {
System.out.println("0์ผ๋ก ๋๋ ์ ์์ต๋๋ค.");
}
โฝ throws ํค์๋ ์ฌ์ฉ - ์์ธ ์์
public void readFile() throws IOException {
FileReader file = new FileReader("test.txt");
}
โฝ finally ๋ธ๋ก ์ฌ์ฉ - ์์ ์ ๋ฆฌ ๋ฑ ํ์ ์์ ์ํ
try {
FileReader file = new FileReader("test.txt");
} catch (IOException e) {
System.out.println("ํ์ผ์ ์ฐพ์ ์ ์์ต๋๋ค.");
} finally {
System.out.println("์์ธ ๋ฐ์ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์คํ๋ฉ๋๋ค.");
}
๐น ์๋ฐ์์์ Exception classes ๊ณ์ธต ๊ตฌ์กฐ
์๋ฐ์์์ ๋ชจ๋ ์์ธ ๋ฐ ์ค๋ฅ ์ ํ์ Throwable ํด๋์ค์ ํ์ ํด๋์ค๋ก ๋ถ๋ฅ๋๋ค.
์ด๋ ํฌ๊ฒ ์ค๋ฅ(Error), ๊ฒ์ฌ ์์ธ(Checked Exception), ๋ฐํ์ ์์ธ(Unchecked Exception) ์ธ ๊ฐ์ง ์ ํ์ผ๋ก ๋๋๋ค.
๐ธ ์ค๋ฅ(Error)
- ์์คํ ์์ ๋น์ ์์ ์ธ ์ํฉ์ด ๋ฐ์ํ ๋ ๋ฐ์ํ๋ ์์ธ
- ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์์ ์ฒ๋ฆฌํ ์ ์๋ ์ฌ๊ฐํ ๋ฌธ์
- ์์คํ ๋ ๋ฒจ์์ ๋ฐ์ํ๋ ๋ฌธ์ ๋ก, ์์ธ ์ฒ๋ฆฌ๋ก ํด๊ฒฐํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง์
[ ๋ํ์ ์ธ ์ ]
- OutOfMemoryError → ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ
- StackOverflowError → ์คํ ์ค๋ฒํ๋ก์ฐ
๐ธ ๊ฒ์ฌ ์์ธ(Checked Exception)
- ์ปดํ์ผ ๋จ๊ณ์์ ๊ฒ์ฌ๋๋ ์์ธ (์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ฐ์ ํจ)
- ๋ฐ๋์ try-catch๋ก ์ฒ๋ฆฌํ๊ฑฐ๋ throws๋ฅผ ์ฌ์ฉํด์ผ ํจ
- ์์ธ ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฉด ์ปดํ์ผ ์ค๋ฅ ๋ฐ์
[ ๋ํ์ ์ธ ์ ]
- ClassNotFoundException → ํด๋์ค ํ์ผ์ ์ฐพ์ ์ ์์
- IOException → ์ ์ถ๋ ฅ ๊ด๋ จ ์์ธ
- SQLException → ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์์ธ
๐ธ ๋ฐํ์ ์์ธ(Unchecked Exception)
- ์ปดํ์ผ ๋จ๊ณ์์ ๊ฒ์ฌ๋์ง ์์ผ๋ฉฐ, ์คํ ์ค(Runtime) ๋ฐ์
- ๋ช ์์ ์ธ ์์ธ ์ฒ๋ฆฌ๊ฐ ํ์๊ฐ ์๋
- ๊ฐ๋ฐ์๊ฐ ์ฝ๋์์ ์ง์ ๋ฐฉ์งํด์ผ ํ๋ ์์ธ
[ ๋ํ์ ์ธ ์ ]
- NullPointerException → ๋ ๊ฐ ์ฐธ์กฐ
- IndexOutOfBoundsException → ๋ฐฐ์ด ๋๋ ๋ฆฌ์คํธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ ๊ทผ
- ArithmeticException → 0์ผ๋ก ๋๋๊ธฐ
๐น ์๋ฐ์์ ์์ธ ์ฒ๋ฆฌ์ ๋ํ 9๊ฐ์ง Best Practices
1๏ธโฃ finally ๋ธ๋ก ๋๋ try-with-resources ์ฌ์ฉ
- ํ์ผ, ๋คํธ์ํฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฑ์ ์์์ ๋ฐ๋์ ํด์ ํด์ผ ํ๋ค.
- Java 7 ์ด์์์๋ try-with-resources ๊ตฌ๋ฌธ์ ํ์ฉํ์ฌ ์๋์ผ๋ก ์์์ ์ ๋ฆฌํ ์ ์๋ค.
2๏ธโฃ ๊ตฌ์ฒด์ ์ธ ์์ธ ํ์ ์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌ
- Exception์ด๋ Throwable๋ฅผ ์ง์ ์ฌ์ฉํ์ง ์๊ณ , ๋ฐ์ํ ์ ์๋ ๋ณด๋ค ๊ตฌ์ฒด์ ์ธ ์์ธ ํ์ ์ ์ฌ์ฉํ๋ค.
3๏ธโฃ ๋ฐ์ํ ์ ์๋ ์์ธ๋ฅผ JavaDoc์ผ๋ก ๋ฌธ์ํ
- throws ํค์๋๋ฅผ ์ฌ์ฉํ ๋, JavaDoc ์ฃผ์์ ๋ฐ์ํ ์ ์๋ ์์ธ ์ ๋ณด๋ฅผ ๋ช ํํ ๊ธฐ์ฌํ๋ค.
4๏ธโฃ ์์ธ ๋ฐ์ ์ ์ค๋ช ๋ฉ์์ง ์ถ๊ฐ
- ์์ธ๋ฅผ ๋์ง ๋, ๋ช ํํ ์ค๋ฅ๋ฅผ ํฌํจํ์ฌ ๋๋ฒ๊น ์ ์ฝ๊ฒ ๋ง๋ ๋ค.
throw new IllegalArgumentException("์
๋ ฅ ๊ฐ์ด ์ ํจํ์ง ์์ต๋๋ค: " + value);
5๏ธโฃ catch๋ฌธ์์ ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ธ ์์ธ๋ถํฐ ์ฒ๋ฆฌ
- ๊ตฌ์ฒด์ ์ธ ์์ธ๋ฅผ ๋จผ์ ์ฒ๋ฆฌํ๊ณ , ๋ ํฌ๊ด์ ์ธ ์์ธ๋ฅผ ๋์ค์ ์ฒ๋ฆฌํด์ผ ํ๋ค.
try {
...
} catch (IOException e) { // ๊ตฌ์ฒด์ ์ธ ์์ธ ๋จผ์
...
} catch (Exception e) { // ๋ฒ์ฉ์ ์ธ ์์ธ ๋์ค์
...
}
6๏ธโฃ Throwable์ ์ก์ง ์๋๋ค. (Exception ๋๋ RuntimeException ์ฌ์ฉ)
- Throwable์ ์ก์ผ๋ฉด Error(์: OutOfMemoryError, StackOverflowError)๊น์ง ํฌ๊ดํ๊ฒ ๋์ด ๋น์ ์์ ์ธ ์ํฉ์์๋ ํ๋ก๊ทธ๋จ์ด ๊ณ์ ์คํ๋ ์ ์๋ค.
- ๋์ , Exception ๋๋ RuntimeException์ ๋ช ํํ๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋ค.
7๏ธโฃ ์์ธ๋ฅผ ๋ฌด์ํ์ง ์๋๋ค. (์ ์ ํ ๋ก๊น ์ํ)
- ์์ธ๋ฅผ ์ก๊ณ ๋ ์๋ฌด ์กฐ์น ์์ด ๋ฌด์ํ๋ฉด ๋ฌธ์ ํ์ ์ด ์ด๋ ค์์ง๋ค.
- ์ต์ํ ๋ก๊น (logging)์ด๋ ์ ์ ํ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ํํด์ผ ํ๋ค.
try {
...
} catch (IOException e) {
System.err.println("ํ์ผ์ ์ฝ๋ ์ค ์ค๋ฅ ๋ฐ์: " + e.getMessage()); // ์ต์ํ์ ๋ก๊ทธ ์ถ๋ ฅ
}
8๏ธโฃ ์ค๋ณต ๋ก๊ทธ๋ฅผ ํผํ๊ณ ์์ธ๋ฅผ ๋ค์ ๋์ง์ง ์๋๋ค.
- ์์ธ๋ฅผ ์ก๊ณ ๋ก๊น ํ ํ ๋ค์ ๋์ง๋ฉด ์ค๋ณต ๋ก๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋ค.
- ์์ธ๋ฅผ ํ ๊ณณ์์๋ง ๋ก๊น ํ๊ฑฐ๋, ์ฒ๋ฆฌํ ๊ณณ์์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค.
9๏ธโฃ ๋ถํ์ํ ์์ธ ๊ฐ์ธ๊ธฐ๋ฅผ ํผํ๊ณ ์๋ ์์ธ ์ ๋ณด๋ฅผ ๋ณด์กด
- ์์ธ๋ฅผ ๊ฐ์ ๋ ์๋ ์์ธ ์ ๋ณด(e.getCause())๋ฅผ ์ ์งํด์ผ ํ๋ค.
try {
...
} catch (IOException e) {
throw new RuntimeException("ํ์ผ ์ฒ๋ฆฌ ์ค ์์ธ ๋ฐ์", e); // ์๋ณธ ์์ธ ํฌํจ
}
๐ reference
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์๋ฃํ(Data Type), ํ ๋ณํ (0) | 2025.02.01 |
---|---|
[Java] ์ ๊ท ํํ์(Regular Expression, Regex) (0) | 2025.01.30 |
[Java] ๊น์ ๋ณต์ฌ(Deep Copy) vs ์์ ๋ณต์ฌ(Shallow Copy) (1) | 2025.01.15 |
[Java] BigInteger - ํฐ ์ซ์(์ ์) ๋ค๋ฃจ๊ธฐ (0) | 2023.11.21 |
[IntelliJ] Java ๋ฒ์ ๋ณ๊ฒฝํ๊ธฐ (JDK) (0) | 2023.09.22 |