-
Live Study - Java ExceptionHello, World π»/Java βοΈ 2021. 1. 23. 12:54
νλ‘κ·Έλ¨ μ€λ₯, Error / Exceptionμ μ°¨μ΄
νλ‘κ·Έλ¨μ΄ μ€ν μ€μ μ΄λ€ μμΈμΌλ‘ μ€μλνκ±°λ, μ μμ μΌλ‘ μ’ λ£λμ§ μλ κ²½μ°κ° μλ€. μ¬κΈ°μ 'μ΄λ€ μμΈ'μ μλ¬(Error) νΉμ μ€λ₯(Exception)λΌκ³ νλ€.
μλ¬μ μ€λ₯μ μ°¨μ΄λ λκΉ?μλ¬, Error
μλ¬λ μμ€ν λ 벨μμ λ¬Έμ κ° λ°μν κ²½μ°λ₯Ό λ§νλ€. λ©λͺ¨λ¦¬ λΆμ‘±(OutOfMemoryError), μ€νμ€λ²νλ‘μ°(StackOverflowError)μ κ°μ΄ μ΄λ¬ν μλ¬κ° λ°μνλ©΄ 볡ꡬν μ μλ μ¬κ°ν μ€λ₯μ΄λ€.
μμΈ, Exception
μμΈλ μ¬μ©μκ° νλ‘κ·Έλ¨μ μ λͺ» μ¬μ©νκ±°λ, νλ‘κ·Έλλ¨Έμ μ€μλ‘ μΈν λ¬Έμ λ₯Ό λ§νλ€. μ΄λ€ μλ₯Ό 0μΌλ‘ λλ΄κ±°λ(ArithmeticException) λ°°μ΄μ ν¬κΈ°λ₯Ό λ²μ΄λμ μ κ·Ό(IndexOutOfBoundException)νλ €κ³ νμ λ λ°μνλ μ€λ₯λ₯Ό λ§νλ€. μμΈλ μλ¬μ λ¬λ¦¬ μμΈ μ²λ¦¬λ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ΄ λΉμ μμ μΌλ‘ μ’ λ£λλ κ²μ λ§κ³ , μ μμ μΈ μ€νμνλ₯Ό μ μ§μν¬ μ μλ€.
μλ°κ° μ 곡νλ μμΈ κ³μΈ΅ ꡬ쑰
λͺ¨λ ν΄λμ€μ μ‘°μμ Object μ΄λ―λ‘ Exception, Error ν΄λμ€ μμ Object ν΄λμ€λ₯Ό μμλ°κ³ μλ€.
λͺ¨λ μμΈμ μ΅κ³ μ‘°μμ Exception ν΄λμ€μ΄λ€.
κ·Έλ¦Όμμ λ³Ό μ μλ―, Exception ν΄λμ€λ₯Ό μμλ°λ ν΄λμ€λ€μ λ κ°μ κ·Έλ£ΉμΌλ‘ λλ μ μλ€.
- RuntimeException ν΄λμ€μ μμ ν΄λμ€λ€, unchecked μμΈ
- κ·Έ μΈμ ν΄λμ€λ€, checked μμΈ
RuntionException ν΄λμ€μ μμν΄λμ€λ€μ unchecked μμΈλΌκ³ λΆλ₯΄κ³ , κ·Έ μΈμ ν΄λμ€λ€μ checked λΌκ³ νλ€.
Exception ν΄λμ€λ₯Ό μμλ°λ μμΈ ν΄λμ€λ€μ μμΈ μ²λ¦¬κ° νμλ€. λ°λ©΄ RuntimeException μ μμλ°μ μμΈ ν΄λμ€λ€μ μμΈ μ²λ¦¬κ° νμλ‘ κ°μ λμ§λ μλλ€. μμΈ μ²λ¦¬κ° κ°μ λλμ κΈ°μ€μΌλ‘ checked, unchecked λ‘ λλλλ° μμΈν λ΄μ©μ μλ(throw, throws λΆλΆ)μ μλ€.μλ°μμ μμΈ μ²λ¦¬ λ°©λ²
1) try - catch - finally
μμΈλ μμΈ μ²λ¦¬λ₯Ό ν΅ν΄ νλ‘κ·Έλ¨μ λΉμ μμ μΈ λμμ λ§κ³ μ μμ μΈ μνλ₯Ό μ μ§μν¬ μ μλ€κ³ νλ€. μλ°μμλ μ΄λ° μμΈλ₯Ό μ²λ¦¬νκΈ° μν΄ try, catch, finally ꡬ문μ μ 곡νλ€.
try { // μμΈκ° λ°μν κ°λ₯μ±μ΄ μλ μ½λ } catch (ExampleException1 e1) { // ExampleException1 μ΄ λ°μν κ²½μ° λμνλ μ½λ } catch (ExampleException2 e2) { // ExampleException2 μ΄ λ°μν κ²½μ° λμνλ μ½λ } ... finally { // μμΈ λ°μ μ¬λΆμ μκ΄μμ΄ μ€νλμ΄μΌ νλ μ½λ μμ± }
μμΈκ° λ°μν μ μλ μ½λλ₯Ό try-catch λ¬ΈμΌλ‘ κ°μΈμ μμΈ μ²λ¦¬λ₯Ό ν μ μλ€. try λΈλμλ μμΈκ° λ°μν κ°λ₯μ±μ΄ μλ μ½λλ₯Ό μμ±νκ³ , catch λΈλμλ μ΄λ€ μμΈκ° λ°μνμ κ²½μ° λμνλ μ½λλ₯Ό μμ±νλ€. λ§μ§λ§ finally λΈλμλ μμΈ λ°μ μ¬λΆμ μκ΄μμ΄ μ€νλμ΄μΌ νλ μ½λλ₯Ό μμ±νλ€.
μ΄λ catch, finally λ¬Έμ νμκ° μλλ€. μλ΅μ΄ κ°λ₯νλ€. νμ§λ§ try λ¬Έμ μ¬μ©ν λ finally λ¬Έμ μλ΅νλ κ²½μ°λ μμ΄λ catch λ¬Έμ μλ΅νλ κ²½μ°λ κ±°μ μμ κ² κ°λ€. κ·Έλ¦¬κ³ catch λ¬Έμ μμμ²λΌ μ¬λ¬λ² μ¬μ©κ°λ₯νλ€. λ°μν μ μλ μμΈμ κ²½μ°μ μ λ§νΌ μ¬μ©κ°λ₯νλ€.
μμΈκ° λ°μνμ λ, 첫λ²μ§Έ catch λ¬Έ λΆν° μ°¨λ‘λ‘ λ΄λ €κ°λ©΄μ μ μΈλ μμΈ ν΄λμ€μ, μμ±λ μμΈ ν΄λμ€μ μΈμ€ν΄μ€μ instanceof μ°μ°μλ₯Ό μ΄μ©ν΄μ κ²μ¬νκ² λλ€. κ²μ¬ κ²°κ³Όκ° true μΈ catch λΈλμ λ§λ λ κΉμ§ κ²μ¬κ° κ³μλλ€.
try λ¬Έμμ λ°μν μ μλ μμΈλ₯Ό catch λ¬Έμμ μ‘μ§ λͺ»ν κ²½μ°, μλ₯Όλ€μ΄ ExampleException3 μ΄ λ°μν κ²½μ°μ catch λΈλμμ ExampleException3 μ catch νμ§ μμλ€λ©΄ μμΈμ²λ¦¬λ₯Ό ν μ μλ€. λ°μν μ μλ κ²½μ°λ₯Ό μκ°μ catch λ¬Έμ μ μμ±ν΄μΌ νλ€.
λ μ£Όμν΄μΌ ν κ²μ μμΈ ν΄λμ€μ μμ ꡬ쑰λ₯Ό μ μκ°ν΄μ catch λ¬Έμ μμλ₯Ό μ μμ±ν΄μΌ νλ€.
λΆλͺ¨ - μμ κ΄κ³μ μμΈ ν΄λμ€κ° μλλ°, λΆλͺ¨ μμΈ ν΄λμ€λ₯Ό λ¨Όμ catch νκ² λλ©΄ μμ μμΈκ° λ°μνλλΌλ, λΆλͺ¨ μμΈλ₯Ό μ²λ¦¬νλ μ½λκ° μ€νλκΈ° λλ¬Έμ΄λ€.
κ°μ μ΄μ λ‘ catch λ¬Έμ λ§μ§λ§μ μ΅κ³ μ‘°μ ν΄λμ€μΈ Exception ν΄λμ€λ₯Ό catch νκ³ μμΌλ©΄ μ΄λ€ μ’ λ₯μ μμΈκ° λ°μνλλΌλ μμΈ μ²λ¦¬λ₯Ό ν μ μλ€.
try, catch, finally λ¬Έμ {} λΈλ λ΄μ ν λ¬Έμ₯λ§ μ¬μ©ν΄λ κ΄νΈλ₯Ό μλ΅ν μ μλ€.μ½λμ νλ¦
try λΈλ λ΄μμ μμΈκ° λ°μν κ²½μ°
=> λ°μν μμΈμ μΌμΉνλ catch λΈλμ΄ μλμ§ νμΈνλ€.
=> μΌμΉνλ catch λΈλμ μ°Ύκ² λλ©΄, κ·Έ catch λΈλμ λ¬Έμ₯μ μννκ³ μ 체 try, catch λ¬Έμ λΉ μ Έλμ¨λ€.
=> finally λΈλμ΄ μμΌλ©΄ ν΄λΉ μ½λλ₯Ό μννλ€.public static int tryMethod() { int result; try { System.out.println("Try Block"); result = 5 / 0; // <- μμΈ λ°μ, μμΈ System.out.println("After Exception"); // μνλμ§ μλλ€. } catch (ArithmeticException e) { System.out.println("Catch Block"); } finally { System.out.println("Finally Block"); result = 0; } return result; } // μ€ν κ²°κ³Ό Try Block Catch Block Finally Block
try λΈλ λ΄μμ μμΈκ° λ°μνμ§ μμ κ²½μ°
=> try λΈλ‘μ μνμ΄ λλλ©΄ try-catch λ¬Έμ λΉ μ Έλμ¨λ€.
=> finally λΈλμ΄ μμΌλ©΄ ν΄λΉ μ½λλ₯Ό μννλ€.try λΈλκ³Ό finally λΈλμ return λ¬Έμ΄ μλ€λ©΄ μ΄λ€ κ°μ΄ return λ κΉ?
public class Main { public static void main(String[] args) { System.out.println(tryMethod()); } public static int tryMethod() { int result; try { result = 5; return result; } catch (Exception e) { System.out.println("Catch Block"); } finally { result = 10; return result; } } }
μ μμμ κ²°κ³Όλ 5 μΌκΉ 10μΌκΉ? κ²°κ³Όλ 10 μ΄λ€. try λ¬Έκ³Ό finally λ¬Έ λͺ¨λμ return λ¬Έμ΄ μλ κ²½μ° finally μ μλ κ°μ΄ λ°νλλ€. 5 μ΄μ§ μμκΉ μκ°νλλ°, finally μ 10 μ΄μ΄μ μμ±ν΄λλ€. μ»΄νμΌλ κ²°κ³Όλ₯Ό 보λ try λΈλμ return λ¬Έμ μμ΄μ§κ³ , finally λΈλμ return λ¬Έλ§ λ¨μμλ κ²μ νμΈνλ€. μλλ .class νμΌμ μΌλΆ.public static int tryMethod() { try { int result = true; } catch (Exception var5) { System.out.println("Catch Block"); } finally { byte var7 = 10; return var7; } }
finally μμ return μ μ°λ건 μν°ν¨ν΄ μ΄λΌκ³ νλ€.
λ©ν° catch λΈλJDK 1.7 λΆν° catch λΈλμ | κΈ°νΈλ₯Ό μ΄μ©ν΄ νλμ catch λΈλμΌλ‘ ν©μΉ μ μκ² λμλ€. μ€λ³΅λ μ½λλ₯Ό μ€μΌ μ μκ² λ€.
μ΄λ | λ λ Όλ¦¬ μ°μ°μκ° μλλΌ κΈ°νΈμ΄λ€.try { // μμΈκ° λ°μν κ°λ₯μ±μ΄ μλ μ½λ } catch (ExampleException1 | ExampleException2 e) { // ExampleException1 νΉμ ExampleException2 μ΄ λ°μν κ²½μ° λμνλ μ½λ }
μ΄λ | κΈ°νΈλ‘ μ°κ²°λ μμΈ ν΄λμ€κ° λΆλͺ¨-μμμ κ΄κ³μ μλ€λ©΄ μ»΄νμΌ μλ¬κ° λ°μνλ€.
κ·Έλ¦¬κ³ μμΈ ν΄λμ€μ 걸리λ μμλ μμμ λΆν° κ±Έλ¦¬κ² λλ€.2) throw, throws
μμΈ μ²λ¦¬μ λ€λ₯Έ λ°©λ²μ μμΈλ₯Ό λμ§λ κ²μ΄λ€. μμ try-catch λ¬Έμ μ¬μ©ν΄ μμΈλ₯Ό μ²λ¦¬νλ λ°©λ²μ μ΄λ€ μ½λλ₯Ό μννλ€κ° μμΈκ° λ°μνλ©΄ ν΄λΉ μ½λ λΆλΆμμ try-catch λ¬ΈμΌλ‘ μμΈμ λν΄ λμνλ λ°©λ²μ΄μλ€.
throw, throws λ¬Έμ μμΈκ° λ°μνμ λ, μμΈκ° λ°μν λΆλΆμ΄ μλλΌ λ€λ₯Έ κ³³(νΈμΆν κ³³)μμ μμΈμ²λ¦¬λ₯Ό μν€λ λ°©λ²μ΄λ€.μμΈλ₯Ό λ°μμν€λ λ°©λ², throw
throw ν€μλλ₯Ό μ¬μ©ν΄ νλ‘κ·Έλλ¨Έκ° μμΈλ₯Ό λ°μμν¬ μ μλ€.
Exception err = new Exception("Error Message"); // new ν€μλλ‘ μμΈ μΈμ€ν΄μ€ μμ± ν throw err; // throw ν€μλλ‘ μμΈλ₯Ό λμ§λ€. (λ°μμν¨λ€.) throw new Exception("Error Message"); // ν μ€λ‘ μΈ μλ μλ€.
throws λ₯Ό λ μμ보기 μ μ checked, unchecked μμΈμ λν΄ μκ³ λμ΄κ°λ©΄ μ’κ² λ€.
checked μμΈ, unchecked μμΈ
μμΈ μ²λ¦¬λ₯Ό κ°μ νλ, μνλμ μ°¨μ΄λ‘ checked, unchecked μμΈλ‘ λλλ€κ³ νλ€. Exception μ νμ ν΄λμ€λ€ μ€ RuntimeException ν΄λμ€λ₯Ό μμλ°μ μμΈ ν΄λμ€λ€μ unchecked λΌκ³ λΆλ₯΄κ³ , RuntimeException ν΄λμ€λ€ μμ λ°μ§ μμ μμΈ ν΄λμ€λ€μ checked μμΈλΌκ³ λΆλ₯Έλ€.
unchecked μμΈλ νλ‘κ·Έλλ¨Έμ μ€μλ‘ λ°μλλ κ²λ€μ΄κΈ° λλ¬Έμ μμΈμ²λ¦¬λ₯Ό κ°μ νμ§ μλλ€.
λ§μ½ unchecked μμΈκ° λ°μν μ μλ μ½λμ μμΈ μ²λ¦¬λ₯Ό ν΄μ€μΌ λλ€λ©΄ λ°°μ΄, μ°Έμ‘° λ³μλ₯Ό μ¬μ©νλ λͺ¨λ μ½λμ try-catch λ¬ΈμΌλ‘ IndexOutOfBoundException, NullPointerException μ²λ¦¬λ₯Ό ν΄μ€μΌ λ κ²μ΄λ€.try { int nums[] = new int[10]; nums[5] = 5; } catch (IndexOutOfBoundsException e) { // .. } catch (NullPointerException e) { // .. }
λ©μλμ μμΈ μ μΈνκΈ°, throws
try-catch λ₯Ό μ μΈν΄μ μμΈμ²λ¦¬λ₯Ό νλ λμ , λ©μλμ λ°μν μ μλ μμΈλ₯Ό μ μΈν΄μ λ©μλλ₯Ό νΈμΆν μͺ½μμ μμΈ μ²λ¦¬λ₯Ό μν¬ μ μλ€.
λ©μλμ μ μΈλΆμ throws ν€μλλ₯Ό μ¬μ©ν΄μ λ©μλ λ΄μμ λ°μν μ μλ ν€μλλ₯Ό μμ±νλ©΄ λλ€. μμΈκ° μ¬λ¬ κ°μΈ κ²½μ° μΌνλ‘ (,) λ‘ κ΅¬λΆν΄μ μμ±νλ©΄ λλ€.public File readFile(String filePath) throws FileNotFoundException, OtherException { // .. }
λ©μλμ μμΈλ₯Ό μ μΈν λ, μΌλ°μ μΌλ‘ unchecked μμΈλ μμ±νμ§ μλλ€. unchecked μμΈλ₯Ό μ μΈν΄λ λ¬Έμ κ° λμ§λ μμ§λ§ λ³΄ν΅ λ°λμ μ²λ¦¬ν΄μΌν μμΈλ€λ§ μ μΈνλ€.λ©μλ λ΄μμ λ°μν μ μλ μμΈλ₯Ό μ μΈλΆμ μμ±ν΄μ λ©μλλ₯Ό νΈμΆνλ μͺ½μμλ μμΈ μ²λ¦¬λ₯Ό κ°μνκΈ° λλ¬Έμ μ’ λ μμ ν μ½λλ₯Ό μμ±ν μ μκ² λλ€.
void method1() throws Exception { method2(); } void method2() throws Exception { throw new Exception(); }
μμΈλ method1, method2 μ²λΌ κ³μ throws λ‘ λκ²¨μ€ μ μλ€.
3) try - with - resources λ¬Έ
JDK 1.7 λΆν° try - catch λ¬Έμ λ³νμΈ try-with-resources λ¬Έμ΄ μΆκ°λμλ€.
μ΄λ€ ν΄λμ€λ€μ (νΉν νμΌ μ μΆλ ₯μ μ¬μ©λλ) μ¬μ©ν νμ, μ¬μ©ν μμμ λ°ννκΈ° μν΄ κΌ λ«μμ€μΌ νλ ν΄λμ€λ€μ΄ μλ€.void readFile(String filePath) { FileInputStream fis = null; DataInputStream dis = null; try { fis = new FileInputStream(filePath); dis = new DataInputStream(fis); } catch (IOException err) { err.printStackTrace(); } finally { fis.close(); dis.close(); } }
μ μμλ λ¬Έμ κ° μλ€. finally λΈλμ μλ close λ©μλλ IOException μμΈκ° λ°μν μ μκΈ° λλ¬Έμ try-catch λ¬ΈμΌλ‘ μ²λ¦¬λ₯Ό ν΄μ€μΌ νλ€.void readFile(String filePath) { FileInputStream fis = null; DataInputStream dis = null; try { fis = new FileInputStream(filePath); dis = new DataInputStream(fis); } catch (IOException err) { err.printStackTrace(); } finally { if (fis != null) { try { fis.close(); } catch (IOException e) { e.printStackTrace(); } } if (dis != null) { try { dis.close(); } catch (IOException e) { e.printStackTrace(); } } } }
μμ κ°μ΄ finally λΈλμ²λΌ null μ²΄ν¬ νμ, try-catch λ¬ΈμΌλ‘ μμΈ μ²λ¦¬λ₯Ό ν΄μ€μΌ λ¬Έμ κ° μλ μ½λκ° λλ€.
μ΄ λ try-with-resources ꡬ문μ μ¬μ©νλ©΄ 볡μ‘ν μμ μ½λλ₯Ό κ°λ¨ν λ§λ€ μ μλ€.void readFile(String filePath) { try (FileInputStream fis = new FileInputStream(filePath); DataInputStream dis = new DataInputStream(fis)) { // .. } catch (IOException err) { err.printStackTrace(); } }
ν¨μ¬ κΉλν΄μ‘λ€. try ν€μλμ () μ κ°μ²΄λ₯Ό μμ±νλ λ¬Έμ₯μ λ£μΌλ©΄ ν΄λΉ κ°μ²΄λ try λΈλμ λ²μ΄λλ μκ° μλμ μΌλ‘ close() κ° νΈμΆλλ€. κ·Έ λ€μμ catch λ finally λΈλμ΄ μνλλ€.
try () μ λ³μλ₯Ό μ μΈνλ κ²λ κ°λ₯νκ³ try λΈλ λ΄μμλ§ μ¬μ©κ°λ₯νλ€. κ·Έλ¦¬κ³ μ μ²λΌ λ κ° μ΄μμ λ³μλ₯Ό μ μΈν κ²½μ° μΈλ―Έ μ½λ‘ μΌλ‘ ꡬλΆν΄μ μ μΈν μ μλ€.μ΄λ κ² μλμΌλ‘ close() κ° μλμΌλ‘ νΈμΆλ μ μμΌλ €λ©΄ ν΄λμ€κ° AutoCloseable μ΄λΌλ μΈν°νμ΄μ€λ₯Ό ꡬνν κ²μ΄μ΄μΌ νλ€.
class CloseableClass implements AutoCloseable { public void doSomething() { System.out.println("Do Something.."); } @Override public void close() throws Exception { System.out.println("Close action"); } }
μ¬μ©μ μ μ μμΈ λ§λ€κΈ°
κΈ°μ‘΄μ μ μλ μμΈ ν΄λμ€ μΈμ νμμ λ°λΌ νλ‘κ·Έλλ¨Έκ° μλ‘μ΄ μμΈ ν΄λμ€λ₯Ό μ μν μ μλ€. μμΈ μ²λ¦¬λ₯Ό κ°μ νκ³ μΆμΌλ©΄ Exception ν΄λμ€λ₯Ό, μμΈ μ²λ¦¬λ₯Ό μ νμ μΌλ‘ νκ³ μΆμ κ²½μ°μ RuntimeException ν΄λμ€λ₯Ό μμ λ°μΌλ©΄ λλ€.
class CheckedException extends Exception { CheckedException(String msg) { super(msg); } } class UncheckedException extends RuntimeException { UncheckedException(String msg) { super(msg); } }
νμμ λ°λΌ μμΈ ν΄λμ€λ₯Ό μμ±ν μλ μμ§λ§, κ°λ₯νλ©΄ μλ°μμ μ 곡νλ μμΈ ν΄λμ€λ₯Ό μ κ·Ή νμ©νλ κ²μ μΆμ²νλ€.
(μ΄νν°λΈ μλ° Item 72)
μλλ μ΄νν°λΈ μλ°μ λμ¨ μ 리 ν.IllegalArgumentException νμ©νμ§ μλ κ°μ΄ 맀κ°λ³μλ‘ μ λ¬λμμ λ IllegalStateException κ°μ²΄κ° λ©μλλ₯Ό μννκΈ° μ μ νμ§ μμ μνμΌ λ NullPointerException null μ νμ©νμ§ μλ λ©μλμ null μ μ λ¬νμ λ IndexOutOfBoundsException μΈλ±μ€κ° λ²μλ₯Ό λμ΄μ°μ λ ConcurrentModificationException νμ©νμ§ μλ λμ μμ μ΄ λ°κ²¬λμ λ UnsupportedOperationException νΈμΆν λ©μλλ₯Ό μ§μνμ§ μμ λ References
μλ°μ μ μ (www.yes24.com/Product/Goods/24259565)
μ΄νν°λΈ μλ° (www.yes24.com/Product/Goods/65551284)'Hello, World π» > Java βοΈ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Live Study - Java Interface (0) 2021.01.07 Live Study - Java Package (0) 2020.12.30 Live Study - Java μμ (Inheritance) (0) 2020.12.23 Live Study - Java μ Class (0) 2020.12.14 Live Study - Java μ νλ¬Έ, λ°λ³΅λ¬Έ (0) 2020.12.06