Try Throw Catch
Java์์ Exception(์์ธ)๋ ํ๋ก๊ทธ๋จ ์คํ ์ค ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฉ์ปค๋์ฆ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก Try → Throw → Catch ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ์ฒ๋ฆฌํ๋ค. ์ด๋ฅผ ํตํด ํ๋ก๊ทธ๋จ์ด ์์ธ ์ํฉ์ ์ง๋ฉดํ์ ๋ ํ๋ก๊ทธ๋จ์ด ๋ฉ์ถ์ง ์๊ณ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๊ฒ ํ๋ค.
์ปดํ์ผ ์๋ฌ์ ๋ฐํ์ ์๋ฌ (Checked / Unchecked Exception)
Java์์ ์๋ฌ๋ฅผ ์๋ฐ ํ๋ก๊ทธ๋จ ์ ์ฅ์์์ ์๋ฌ ๋ฐ์ ๊ทผ์(Source)์ ๋ฐ๋ผ 2๊ฐ์ง๋ก ๊ตฌ๋ถํด๋์๋ค. E
- Checked Exception (์ปดํ์ผ์๋ฌ): ํ๋ก๊ทธ๋จ ์ธ๋ถ์์ ๋ฐ์ํ๋ ์์ ๊ฐ๋ฅํ ์ค๋ฅ๋ก, ๋ฐ๋์ ์ฒ๋ฆฌํด์ผํ๋ค. ์์ธ ์ฒ๋ฆฌ๊ฐ ์์ผ๋ฉด ์ปดํ์ผ ์์ฒด๊ฐ ๋์ง ์๋๋ค.
- Unchecked Exception (๋ฐํ์์๋ฌ): ํ๋ก๊ทธ๋จ ๋ด๋ถ ๋ก์ง์์ ๋ฐ์ํ๋ ์์ธก ๋ถ๊ฐ๋ฅํ ์ค๋ฅ๋ก, ์คํ ์ค์ ๋ฐ๋์ ์ฒ๋ฆฌํ ํ์๋ ์์ง๋ง ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ธฐ์ํด์ ์ฒ๋ฆฌํด์ผํ๋ค.(Uncheced Exception ์ฒ๋ฆฌ์ ๊ฐ์ฅ ๊ทผ๋ณธ์ด์ ์์น)
Checked Exception: ํ๋ก๊ทธ๋จ ์ธ๋ถ์์ ๋ฐ์ํ๋ ์ค๋ฅ
Checked Exception์ ํ์ผ์ ์ฝ๊ฑฐ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ๋ ์ฒ๋ผ ์ธ๋ถ ์์๊ณผ ์ํธ์์ฉํ ๋ ๋ฐ์ํ๋ ์ค๋ฅ์ด๋ค.
Checked Exception์ ์ปดํ์ผ ์์ ์ ์ฒ๋ฆฌ(ํน์ ์ ์ธ)ํด์ผํ๋ ์์ธ์ด๋ค. ์ฆ, ์์ธ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋, ํด๋น ์์ธ๋ฅผ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ณ , Java์์๋ ์ปดํ์ผ๋ฌ๊ฐ ์ด๋ฅผ ๊ฐ์ ํ๋ค.
๋ํ์ ์ธ Checked Exception
- IOException: ํ์ผ ์ ์ถ๋ ฅ ๊ณผ์ ์์ ๋ฐ์
- SQLException: ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์ค๋ฅ
- ParseException: ํ์์ด ์๋ชป๋ ์ ๋ ฅ ์ฒ๋ฆฌ ์ค ๋ฐ์
์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
1. Try-Catch: ๋ฉ์๋ ๋ด์์ ์ง์ ์ฒ๋ฆฌํ๋ค.
private static void checkedExceptionWithTryCatch() {
try {
File file = new File("not_existing_file.txt");
FileInputStream stream = new FileInputStream(file;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
2. Throw: ์์ธ๋ฅผ ํธ์ถํ ๋ฉ์๋๋ก ๋๊ธฐ๊ณ , ํด๋น ๋ฉ์๋์์ ์ฒ๋ฆฌํ๋๋ก ํ๋ค.
private static void checkedExceptionWithThrow() throws FileNotFoundException {
File file = new File("not_existing_file.txt");
FileInputStream stream = new FileInputStream(file);
Unchecked Exception: ํ๋ก๊ทธ๋จ ๋ด๋ถ์์ ๋ฐ์ํ๋ ์ค๋ฅ
Unchecked Exception์ ํ๋ก๊ทธ๋จ ๋ด๋ถ ๋ก์ง์์ ์์ธกํ ์ ์๋ ์ค๋ฅ๋ก, ๋ณต๊ตฌ๊ฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
์ด ์์ธ๋ ํ๋ก๊ทธ๋จ ์คํ ์ค์ ๋ฐ์ํ๋ฉฐ, ๋ฐํ์์๋ง ํ์ธ๋๋ค. ๋ฐ๋์ ์์ธ์ฒ๋ฆฌ๊ฐ ์๊ตฌ๋์ง๋ ์์ง๋ง, ๋ก๊ทธ์ StackTrace๋ฅผ ๋จ๊ฒจ ๋ฌธ์ ๋ฅผ ๋ถ์ํ๋ ๊ฒ์ด ์ค์ํ๋ค. ๋ฐ๋ผ์ฌ ๊ฐ๋ฐ์๊ฐ ์ํ ๊ฒฝ์ฐ `try-catch` ๊ตฌ๋ฌธ๊ณผ `throws` ํค์๋๋ก ์ฒ๋ฆฌํ ์ ์๋ค.
- Stacktrace: ์ด๋์์ ๋ฐ์ํ๋์ง? = Call Stack
- ๋ก๊ทธ: ํํธ ํน์ ์ด์๋ฅผ ์ถ๋ก ํ๊ธฐ์ ๋์ ๋ ๋งํ ์์
๋ํ์ ์ธ Unchecked Exception
- NullPointerException: null ๊ฐ์ ์ฐธ์กฐํ ๋ ๋ฐ์
- ArithmeticException: 0์ผ๋ก ๋๋ ๋ ๋ฐ์
- ArrayIndexOutOfBoundsException: ๋ฐฐ์ด ์ธ๋ฑ์ค ์ด๊ณผ ์ ๊ทผ ์ ๋ฐ์
- RuntimeException: ๋ค์ํ ์๊ธฐ์น ๋ชปํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ ์ฌ์ฉ
์์์ฝ๋
private static void uncheckedExceptionWithTryCatch(String str) {
try {
str = str.toUpperCase(); // str์ด null์ผ ์ ์๋ค.
System.out.println(str);
} catch (NullPointerException e) {
e.printStackTrace();
}
}
Custom Exception: ์ฌ์ฉ์ ์ ์ ์์ธ
JAVA์์๋ ํน์ ๋น์ฆ๋์ค ๋ก์ง์ ๋ง๋ ์ปค์คํ ์์ธ๋ฅผ ์ ์ํ์ฌ ๋ ๋ช ํํ๊ฒ ์์ธ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์์์น ๋ชปํ ์ํฉ์ ์ ์ ํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
- ์์ ์ฝ๋
class CustomException extends RuntimeException {
private String errorCode;
public CustomException(String message, String errorCode) {
super(message);
this.errorCode = errorCode;
}
public String getErrorCode() {
return errorCode;
}
}
๋ค์ค ์์ธ ์ฒ๋ฆฌ
Java์์๋ ์ฌ๋ฌ ์์ธ๋ฅผ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๊ฑฐ๋, ์์ธ๋ฅผ ๋ถ๊ธฐ ์ฒ๋ฆฌํ ์๋ ์๋ค.
try {
// ์ฝ๋ ์คํ
} catch (IllegalArgumentException | IndexOutOfBoundsException e) {
// ๋ค์ค ์์ธ ์ฒ๋ฆฌ
} catch (FileNotFoundException e) {
// ๊ฐ๋ณ ์์ธ ์ฒ๋ฆฌ
} catch (Exception e) {
}
- ์๊ณ ์๋ Exception์ ์ง์ ์ก์์ ์ฒ๋ฆฌํ๋ฉด๋์ง๋ง, ๋ชจ๋ฅผ ์๋ ์๋ Exception๋ ์กด์ฌํ๋ค. ์ด๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๋ค์ค ์์ธ์ฒ๋ฆฌ ๋ง์ง๋ง์ `Exception e` ์ฝ๋๋ฅผ ์ถ๊ฐํ์ฌ ์ฒ๋ฆฌํ๋ค.
Unchcked Exception๊ณผ Checked Exception ์ฌ์ฉ ์๊ธฐ
Java์์ Checked Exception๊ณผ Unchecked Exception์ ๊ฐ๊ฐ์ ์ฌ์ฉ ๋ชฉ์ ์ ๋ฐ๋ผ ๊ตฌ๋ถ๋๋ค.
- ๋ณต๊ตฌ ๊ฐ๋ฅํ ์กฐ๊ฑด์ ๋ํด์ Checked Exception์ ์ฌ์ฉํ๋ค. ์ด๋ฌํ ์์ธ๋ ์ธ๋ถ ํ๊ฒฝ(ํ์ผ ์์คํ
, ๋คํธ์ํฌ ๋ฑ)์์ ๋ฐ์ํ๋ฉฐ, ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ๋ฐ๋์ ์ฒ๋ฆฌํด์ผํ๋ค.
- ์์: ํ์ผ์ ์ฝ์ผ๋ ค๊ณ ํ ๋ ํ์ผ์ด ์กด์ฌํ์ง ์์ผ๋ฉด `FileNotFoundException`์ ์ฒ๋ฆฌํด ํ์ผ ๊ฒฝ๋ก๋ฅผ ์์ ํ๊ฑฐ๋ ๋์ฒด ํ์ผ์ ์์ฒญํ ์ ์๋ค.
- ํ๋ก๊ทธ๋๋ฐ ์ค๋ฅ๋ Unchecked Exception์ ์ฌ์ฉํ๋ค. ์ด๋ ํ๋ก๊ทธ๋จ ๋ด๋ถ์ ๋ก์ง ์ค๋ฅ์์ ๋ฐ์ํ๋ ์์ธ๋ก, ์์ธก์ด ์ด๋ ต๊ณ ๋ฐ์ ์์ ์ ์ ํํ ์ ์ ์๋ค.
- ์์: ๋ฐฐ์ด์ ํฌ๊ธฐ๋ฅผ ์๋ชป ๊ณ์ฐํด ๋ฐ์ํ๋ `ArrayIndexOutOfBoundsException`์ด๋ `NullPointerException`์ ๋ด๋ถ ๋ก์ง ๋ฌธ์ ์ด๋ค. ์ด ๊ฒฝ์ฐ, ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๊ธฐ ์ ์ ๋ก๊ทธ๋ฅผ ๋จ๊ธฐ๊ฑฐ๋, ์ฝ๋๋ฅผ ์์ ํด์ผ ํ๋ค.
Checked Exception์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋ ์ด์ (?)
- ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๊ฐ์ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด Checked Exception์ ์ ์ฌ์ฉํ์ง ์๋๋ค. Checked Exception์ ์๋์ ์ผ๋ก ๋ณต๊ตฌํ ์ ์๋ ์ค๋ฅ๋ฅผ ๋ค๋ฃจ์ง๋ง, ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์ด๋ฅผ ์ผ์ผ์ด ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๋ถํ์ํ ๋ณต์ก์ฑ์ ์ถ๊ฐํ ์ ์๋ค.
Bruce Eckel์ ์ ์ Thinking in Java์์ "๋๊ท๋ชจ ํ๋ก์ ํธ์์ Checked Exception์ด ์์ฐ์ฑ์ ์ ํ์ํฌ ์ ์์ผ๋ฉฐ, ์ฝ๋ ํ์ง์ ํฅ์์ ํฐ ๊ธฐ์ฌ๋ฅผ ํ์ง ์๋๋ค" ๊ณ ์ธ๊ธํ๋ค.
์์ธ ์ฒ๋ฆฌ๋ฅผ ์ ๋ค๋ฃฌ๋ค๋ ๊ฒ์ด ์ ์
์์ธ ์ฒ๋ฆฌ๋ฅผ ์ ๋ค๋ฃจ๋ ๊ฒ์ ๋ฅ๋ ฅ ์๋ ๊ฐ๋ฐ์์์ ๋ํ๋ด๋ ์ค์ํ ์งํ์ด๋ค. ์ข์ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์ํด์๋ ๋ค์ ๋ ๊ฐ์ง ์์๋ฅผ ๊ณ ๋ คํด์ผ ํ๋ค.
- ๊ณ์ธต์ ์ ๋๋๋ค: ์์ธ ์ฒ๋ฆฌ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ ๊ณ์ธต(Repository, Service, Controller ๋ฑ)์ ๋ง๊ฒ ๊ตฌ๋ถํด์ผ ํ๋ค. ๊ณ์ธต์ ๋ฐ๋ผ ์์ธ๋ฅผ ๊ตฌ์ฒดํํ๊ฑฐ๋, ์ ์ ํ ์์น์์ ์ฒ๋ฆฌํจ์ผ๋ก์จ ์ฝ๋์ ์ ์ง๋ณด์์ฑ์ ๋์ผ ์ ์๋ค.
- ์์ธ ์ข
๋ฅ๋ฅผ ์ ๋๋๋ค: ๊ฐ ์์ธ ์ํฉ์ ๋ช
ํํ ๊ตฌ๋ถํ๊ณ , ๋ค์ํ ์์ธ๋ฅผ ์ ์ ํ ์ฒ๋ฆฌํ ์ ์๋๋ก Custom Exception์ด๋ Enum์ ํ์ฉํด ์์ธ๋ฅผ ๊ด๋ฆฌํ๋ค.
- ์๋ฅผ ๋ค์ด, ํ์ผ ์ฒ๋ฆฌ์์ ๋ฐ์ํ๋ ์์ธ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ์คํจ์์
- ๋ฐ์ํ๋ ์์ธ๋ฅผ ๊ตฌ์ฒด์ ์ธ ์์ธ ํด๋์ค๋ก ๋๋์ผ๋ก์จ, ๋ณด๋ค ๋ช ํํ๊ณ ์ง๊ด์ ์ธ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ๋ค.[
โน๏ธ์ฐธ๊ณ
[ASAC 6๊ธฐ ๊ฐ์์๋ฃ]
'๐ปDEV-STUDY > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] Final๊ณผ Static (2) | 2024.09.30 |
---|---|
[Java] Collection (0) | 2024.09.28 |
[Java] ๊ฐ์ฒด ์์ฑํ๋ 3๊ฐ์ง ๋ฐฉ๋ฒ (0) | 2024.09.25 |
[Java] JVM (Java Virtual Machine) (3) | 2024.09.25 |
[Java] Java ๋์ ์๋ฆฌ (0) | 2024.09.25 |