λͺ©μ°¨
νλ‘κ·Έλ¨μ κ°λ°νλ€ λ³΄λ©΄ μμμΉ λͺ»ν μν©μ΄ λ°μνκΈ° λ§λ ¨μ λλ€. μ¬μ©μκ° μλͺ»λ μ λ ₯μ νκ±°λ, λ€νΈμν¬ μ°κ²°μ΄ λκΈ°κ±°λ, νμΌμ΄ μ‘΄μ¬νμ§ μλ λ± λ€μν λ¬Έμ κ° μκΈΈ μ μμ£ .
μλ°μμλ μ΄λ° μμΈ μν©μ ν¨κ³Όμ μΌλ‘ λ€λ£¨κΈ° μν μμΈ μ²λ¦¬(Exception Handling) λ©μ»€λμ¦μ μ 곡ν©λλ€.
μμΈ μ²λ¦¬λ₯Ό μνλ©΄ νλ‘κ·Έλ¨μ΄ μ€λ¨λμ§ μκ³ , μ¬μ©μμκ² μΉμ ν λ©μμ§λ₯Ό 보μ¬μ£Όλ©°, λ¬Έμ μ μμΈμ μΆμ νκΈ° μ¬μ΄ μ½λλ₯Ό μμ±ν μ μμ΄μ.
μ€λμ μλ° μμΈ μ²λ¦¬μ κΈ°λ³Έ κ°λ κ³Ό ꡬν λ°©λ²μ λν΄ μμλ³΄κ² μ΅λλ€.
π₯ μμΈλ 무μμΈκ°?
μμΈ(Exception)λ νλ‘κ·Έλ¨ μ€ν μ€μ λ°μνλ μκΈ°μΉ μμ μ΄λ²€νΈλ‘, νλ‘κ·Έλ¨μ μ μμ μΈ νλ¦μ λ°©ν΄ν©λλ€.
μλ¬(Error) vs μμΈ(Exception)
μλ¬(Error)λ μμ€ν λ 벨μ μ¬κ°ν λ¬Έμ λ‘, λλΆλΆ νλ‘κ·Έλ¨μμ μ²λ¦¬ν μ μμ΅λλ€. OutOfMemoryErrorλ StackOverflowError κ°μ μλ¬λ JVM μ체μ λ¬Έμ λ 리μμ€ λΆμ‘± λ±μΌλ‘ λ°μνλ©°, μ ν리μΌμ΄μ μ½λμμ 볡ꡬνκΈ° μ΄λ ΅μ΅λλ€.
μμΈ(Exception)λ νλ‘κ·Έλ¨ μ½λμμ μ²λ¦¬ν μ μλ λ¬Έμ μ λλ€. μ μ ν μ²λ¦¬λ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ κ³μ μ€νν κ°λ₯μ±μ΄ μμ£ . NullPointerExceptionμ΄λ FileNotFoundException κ°μ μμΈλ μ μ ν μμΈ μ²λ¦¬ λ©μ»€λμ¦μ ν΅ν΄ κ΄λ¦¬ν μ μμ΅λλ€.
μ μμΈ μ²λ¦¬κ° νμν κΉ?
- νλ‘κ·Έλ¨ μμ μ± ν₯μ: μμΈ λ°μ μμλ νλ‘κ·Έλ¨μ΄ λΉμ μ μ’ λ£λμ§ μκ³ κ³μ μ€νλ μ μκ² ν¨
- λλ²κΉ μ©μ΄μ±: μμΈ λ°μ μ μμΈμ λ μ½κ² νμ ν μ μμ
- μ½λ νμ§ ν₯μ: μμΈ μν©μ 미리 κ³ λ €νμ¬ λ κ²¬κ³ ν μ½λ μμ± κ°λ₯
- μ μ§λ³΄μμ± μ¦κ°: μμΈ μ²λ¦¬ λ‘μ§μ λΆλ¦¬ν¨μΌλ‘μ¨ μ½λ κ°λ μ±κ³Ό μ μ§λ³΄μμ± ν₯μ
μμΈ μ²λ¦¬μ μμΉ
ν¨κ³Όμ μΌλ‘ μμΈ μ²λ¦¬λ₯Ό μν΄ λͺ κ°μ§ κΈ°λ³Έ μμΉμ΄ μμ΅λλ€.
- μ μ ν λ²μμμ μ²λ¦¬: μμΈλ₯Ό κ°μ₯ μ μ νκ² μ²λ¦¬ν μ μλ μμΉμμ μ²λ¦¬
- ꡬ체μ μΈ μμΈ ν¬μ°©: κ°λ₯ν ν ꡬ체μ μΈ μμΈ νμ μ μ¬μ©νμ¬ ν¬μ°©
- μλ―Έ μλ μ 보 μ 곡: μμΈ λ©μμ§μ λ¬Έμ ν΄κ²°μ λμμ΄ λλ μ 보 ν¬ν¨
- 리μμ€ μ 리: μμΈ λ°μ μ¬λΆμ κ΄κ³μμ΄ λ¦¬μμ€(νμΌ, λ€νΈμν¬ μ°κ²° λ±)λ₯Ό μ μ ν μ 리
π μμΈμ μ’ λ₯ (Checked vs Unchecked)
Checked Exception
μ»΄νμΌ νμμ νμΈλλ μμΈλ‘, λ°λμ λͺ μμ μΈ μμΈ μ²λ¦¬κ° νμν©λλ€.
μ΄λ¬ν μμΈλ try-catch λΈλ‘μΌλ‘ μ²λ¦¬νκ±°λ throws ν€μλλ₯Ό μ¬μ©νμ¬ λ©μλ μ μΈλΆμ λͺ μν΄μΌ ν©λλ€.
Checked Exceptionμ μ£Όλ‘ νλ‘κ·Έλ¨ μΈλΆ μμΈμ μν΄ λ°μνλ μμΈλ‘, κ°λ°μκ° μ μ ν λμν κ²μΌλ‘ κΈ°λλλ μν©μμ μ¬μ©λ©λλ€. IOException, SQLException, ClassNotFoundException λ±μ΄ λνμ μΈ Checked Exceptionμ λλ€.
import java.io.FileReader;
import java.io.IOException;
public class CheckedExceptionExample {
public static void main(String[] args) {
try {
FileReader file = new FileReader("non-existent-file.txt");
} catch (IOException e) {
System.out.println("νμΌμ μ°Ύμ μ μμ΅λλ€: " + e.getMessage());
}
}
}
Unchecked Exception
RuntimeException ν΄λμ€μ κ·Έ νμ ν΄λμ€λ‘, μ»΄νμΌλ¬κ° μμΈ μ²λ¦¬λ₯Ό κ°μ νμ§ μμ΅λλ€.
μ΄λ¬ν μμΈλ μ£Όλ‘ νλ‘κ·Έλλ° μ€λ₯μ μν΄ λ°μνλ©°, μ½λλ₯Ό μμ νμ¬ μλ°©νλ κ²μ΄ λ°λμ§ν©λλ€.
NullPointerException, ArrayIndexOutOfBoundsException, ArithmeticException λ±μ΄ λνμ μΈ Unchecked Exceptionμ λλ€.
λͺ μμ μΈ μμΈ μ²λ¦¬λ νμκ° μλμ§λ§, νλ‘κ·Έλ¨μ μμ μ±μ μν΄ μ€μν λΆλΆμμλ μ²λ¦¬νλ κ²μ΄ μ’μ΅λλ€.
public class UncheckedExceptionExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3};
// μμΈ μ²λ¦¬κ° νμλ μλμ§λ§, νλ‘κ·Έλ¨μ μμ μ±μ μν΄ μ²λ¦¬νλ κ²μ΄ μ’μ
try {
System.out.println(numbers[5]);
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("λ°°μ΄ μΈλ±μ€ λ²μλ₯Ό λ²μ΄λ¬μ΅λλ€: " + e.getMessage());
}
}
}
π μμ£Ό μ¬μ©νλ μμΈ ν΄λμ€
μμΈ ν΄λμ€ | μ€λͺ |
NullPointerException | null κ°μ μ°Έμ‘°νλ €κ³ ν λ |
ArrayIndexOutOfBoundsException | λ°°μ΄ μΈλ±μ€κ° λ²μλ₯Ό λ²μ΄λ¬μ λ |
IllegalArgumentException | λ©μλμ μλͺ»λ μΈμλ₯Ό μ λ¬νμ λ |
NumberFormatException | λ¬Έμμ΄μ μ«μλ‘ λ³νν λ νμμ΄ λ§μ§ μμ λ |
IOException | μ μΆλ ₯ μμ μ€ λ¬Έμ λ°μ μ (νμΌ, λ€νΈμν¬ λ±) |
π try-catch-finally ꡬ쑰
Javaμμ μμΈλ₯Ό μ²λ¦¬νλ κ°μ₯ κΈ°λ³Έμ μΈ λ°©λ²μ try-catch-finally λΈλ‘μ μ¬μ©νλ κ²μ λλ€.
기본 ꡬ쑰
μμΈκ° λ°μν μ μλ μ½λλ₯Ό try λΈλ‘μΌλ‘ κ°μΈκ³ , λ°μν μμΈλ₯Ό catch λΈλ‘μμ μ²λ¦¬νλ©°, finally λΈλ‘μμλ μμΈ λ°μ μ¬λΆμ κ΄κ³μμ΄ νμ μ€νλμ΄μΌ νλ μ½λλ₯Ό μμ±ν©λλ€.
try {
// μμΈκ° λ°μν μ μλ μ½λ
} catch (μμΈν΄λμ€ λ³μλͺ
) {
// μμΈ λ°μ μ μ€νλ μ½λ
} finally {
// μμΈ λ°μ μ¬λΆμ μκ΄μμ΄ νμ μ€ν
}
λ¨Όμ try λΈλ‘ λ΄μ μ½λκ° μ€νλλ©°, μμΈκ° λ°μνλ©΄ ν΄λΉ μμΈ νμ μ λ§λ catch λΈλ‘μΌλ‘ μ μ΄κ° μ΄λν©λλ€.
μ¬λ¬ catch λΈλ‘μ΄ μλ κ²½μ°, λ°μν μμΈ νμ κ³Ό μΌμΉνλ 첫 λ²μ§Έ catch λΈλ‘μ΄ μ€νλ©λλ€.
finally λΈλ‘μ μμΈ λ°μ μ¬λΆμ κ΄κ³μμ΄ νμ μ€νλλ©°, try λλ catch λΈλ‘μμ return λ¬Έμ΄ μ€νλμ΄λ finally λΈλ‘μ μ€νλ©λλ€.
λ€μ€ catchλ¬Έ
λ€μν μ νμ μμΈλ₯Ό μ²λ¦¬νκΈ° μν΄ μ¬λ¬ catch λΈλ‘μ μ¬μ©ν μ μμ΅λλ€.
μ΄ κ²½μ°, μμΈ κ³μΈ΅ ꡬ쑰μμ μμ ν΄λμ€ μμΈλ νμ ν΄λμ€ μμΈ λ€μ λ°°μΉν΄μΌ ν©λλ€.
κ·Έλ μ§ μμΌλ©΄ νμ ν΄λμ€ μμΈκ° μ²λ¦¬λμ§ μκ³ μμ ν΄λμ€ μμΈ μ²λ¦¬κΈ°μ μν΄ ν¬μ°©λ μ μμ΅λλ€.
try {
// μμΈ λ°μ κ°λ₯ μ½λ
} catch (ArithmeticException e) {
// ArithmeticException μ²λ¦¬
} catch (NullPointerException e) {
// NullPointerException μ²λ¦¬
} catch (Exception e) {
// λ€λ₯Έ λͺ¨λ μμΈ μ²λ¦¬
}
π‘ Java 7 μ΄μμμλ catch (A | B e) λ¬Έλ²μΌλ‘ νλμ catch λΈλ‘μμ μ¬λ¬ μμΈ μ²λ¦¬λ κ°λ₯ν΄μ!
finally λΈλ‘
μμΈ λ°μ μ¬λΆμ μκ΄μμ΄ λ¬΄μ‘°κ±΄ μ€νλλ μμμ λλ€.
μ£Όλ‘ νμΌ λ«κΈ°, DB μ°κ²° ν΄μ λ± μμ μ 리 μ½λμ μ£Όλ‘ μ¬μ©λ©λλ€.
try {
System.out.println("νμΌ μ΄κΈ°");
} catch (Exception e) {
System.out.println("μ€λ₯ λ°μ");
} finally {
System.out.println("μμ μ 리");
}
π λ§λ¬΄λ¦¬
μ΄λ² κΈμμλ Java μμΈ μ²λ¦¬μ κΈ°μ΄ κ°λ μ μ€μ¬μΌλ‘ μμΈκ° 무μμ΄κ³ , μ μ²λ¦¬ν΄μΌ νλμ§, κ·Έλ¦¬κ³ try-catch-finally ꡬ쑰λ₯Ό μ΄λ»κ² μ¬μ©νλμ§ λ°°μλ΄€μ΅λλ€.
μμΈ μ²λ¦¬λ νλ‘κ·Έλ¨μ μμ μ±κ³Ό μ λ’°μ±μ λμ΄λ μ€μν κΈ°μ μ λλ€. μ μ ν μμΈ μ²λ¦¬λ₯Ό ν΅ν΄ μμμΉ λͺ»ν μν©μμλ νλ‘κ·Έλ¨μ΄ μ°μνκ² μ²λ¦¬λλλ‘ ν΄μΌ ν©λλ€.
λ€μ κΈμμλ throw, throwsμ μ¬μ©μ μ μ μμΈ ν΄λμ€λ₯Ό λ€λ£¨λ©° μμΈλ₯Ό μ§μ μ€κ³νκ³ μ μ΄νλ λ°©λ²μ λ°°μλ³Ό μμ μ λλ€.
κΆκΈν λ΄μ©μ΄λ μΆκ°λ‘ μκ³ μΆμ κ°λ μ΄ μλ€λ©΄ λκΈλ‘ λ¨κ²¨μ£ΌμΈμ π