[JAVA] EXCEPTION

μ„±μž₯일기·2024λ…„ 7μ›” 22일
0

[SWCAMP] JAVA

λͺ©λ‘ 보기
11/16

μ˜ˆμ™Έμ²˜λ¦¬

πŸ’‘ 였λ₯˜(Error)와 μ˜ˆμ™Έ(Exception)
였λ₯˜: μ‹œμŠ€ν…œ μƒμ—μ„œ ν”„λ‘œκ·Έλž¨μ— μ‹¬κ°ν•œ λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬ 싀행쀑인 ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λŠ” 것을 λ§ν•˜λ©° κ°œλ°œμžκ°€ 미리 μ˜ˆμΈ‘ν•˜κ±°λ‚˜ μ½”λ“œλ‘œ μ²˜λ¦¬ν•˜λŠ” 것이 λΆˆκ°€λŠ₯ ν•œ 경우λ₯Ό λ§ν•œλ‹€.
(ex: JVM μ—λŸ¬, μ •μ „, 컴퓨터 자체 ν•˜λ“œμ›¨μ–΄μ μΈ 문제 λ“±)

μ˜ˆμ™Έ: 였λ₯˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ 싀행쀑인 ν”„λ‘œκ·Έλž¨μ„ μ’…λ£Œμ‹œν‚€λŠ” 것이 μΌλ°˜μ μ΄μ§€λ§Œ λ°œμƒν•  수 μžˆλŠ” 상황을 κ°œλ°œμžκ°€ 미리 μ˜ˆμΈ‘ν•˜κ³  μ²˜λ¦¬ν•  수 μžˆλŠ” λ―Έμ•½ν•œ 였λ₯˜λ₯Ό λ§ν•œλ‹€.

μ˜ˆμ™Έ μƒν™©μ˜ κ²½μš°λŠ” κ°œλ°œμžκ°€ 적절히 μ²˜λ¦¬ν•˜μ—¬ μ½”λ“œμ˜ 흐름을 컨트둀(비정상적인 μ’…λ£Œλ₯Ό ν•  μˆ˜λ„ 있고 κ·Έλ ‡μ§€ μ•Šκ²Œ ν•  μˆ˜λ„ 있게) ν•  수 μžˆλ‹€.

μ˜ˆμ™Έ 처리λ₯Ό μ‚¬μš©ν•˜λŠ” 이유

πŸ’‘ 였λ₯˜λ‚˜ μ˜ˆμ™ΈλŠ” μ‚¬μš©μžμ—κ²Œ μ’‹μ§€ μ•Šμ€ μ‚¬μš© κ²½ν—˜μ„ μ œκ³΅ν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ 미리 μ˜ˆμΈ‘ν•˜κ³  컨트둀 ν•  수 μžˆλŠ” μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•¨μœΌλ‘œμ¨ ν”„λ‘œκ·Έλž¨μ΄ μ˜ˆμƒμΉ˜ λͺ»ν•œ 상황에 λ΄‰μ°©ν•˜μ§€ μ•Šλ„λ‘ μ½”λ“œμ˜ μ•ˆμ •μ„±κ³Ό 신뒰성을 λ†’μ—¬ 이λ₯Ό 미연에 λ°©μ§€ν•˜κ±°λ‚˜ μ˜λ„ν•œ λ°©ν–₯으둜 컨트둀 ν•  수 μžˆλ‹€.
λ˜ν•œ 개발 μ‹œμ—λ„ 디버깅을 μš©μ΄ν•˜κ²Œ ν•΄μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•œ 원인과 μœ„μΉ˜λ„ μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆμ–΄ μš©μ΄ν•˜λ‹€.

μ˜ˆμ™Έ 클래슀의 μ’…λ₯˜

μ˜ˆμ™Έ 클래슀의 계측ꡬ쑰

  • 였λ₯˜μ™€ μ˜ˆμ™ΈλŠ” λͺ¨λ‘ Throwable을 상속 λ°›λŠ”λ‹€.
  • μ˜ˆμ™Έμ˜ μ΅œμƒμœ„ ν΄λž˜μŠ€λŠ” Exception ν΄λž˜μŠ€μ΄λ‹€.
  • Unchecked Exception 계열은 기본적 이미 μ²˜λ¦¬λ˜μ–΄ 있고 μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜κ²Œ μž‘μ„±λ˜μ–΄ μžˆλ‹€.
  • Checked Exception 계열은 λ°˜λ“œμ‹œ μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ•Ό ν•˜κ³  ν•˜μ§€ μ•ŠμœΌλ©΄ 컴파일 μ—λŸ¬κ°€ λ°œμƒν•œλ‹€.
  • RuntimeExceptionνƒ€μž…μ˜ μ˜ˆμ™Έλ“€μ€ λŸ°νƒ€μž„ μ‹œμ μ— ν•΄λ‹Ή μ˜ˆμ™Έ 클래슀 νƒ€μž…μ˜ Exception이 λ°œμƒν•œλ‹€.

RuntimeExcpetion 후손 클래슀 λͺ‡ κ°€μ§€

  • ArithmeticException
    • 0으둜 λ‚˜λˆ„λŠ” 경우 λ°œμƒ

      int dividend = 3;
      System.out.println(dividend / 0);

  • ArrayIndexOutOfBoundsException
    • λ°°μ—΄μ˜ indexλ²”μœ„λ₯Ό λ„˜μ–΄μ„œ μ°Έμ‘°ν•˜λŠ” 경우 λ°œμƒ

      int[] intArr = new int[0];
      System.out.println(intArr[1]);

  • NullPointerException
    - μΈμŠ€ν„΄μŠ€κ°€ μ°Έμ‘°λ˜μ§€ μ•Šμ€ μƒνƒœ(Null)둜 μΈμŠ€ν„΄μŠ€μ— μ ‘κ·Όν•˜λŠ” 경우 λ°œμƒ

        ```java
        int[] intArr = null;
        System.out.println(intArr[0]);
        ```

  • ClassCastException

    • ν˜•λ³€ν™˜(Castμ—°μ‚°μž μ‚¬μš©) μ‹œ μžλ£Œν˜•μ— λ¬Έμ œκ°€ μžˆμ„ λ•Œ λ°œμƒ

      Object obj = new String("hello");
      int num = (Integer)obj;

  • NegativeArraySizeException
    • λ°°μ—΄ 크기λ₯Ό 음수둜 μ§€μ •ν•œ 경우 λ°œμƒ

      int[] intArr = new int[-1];

μ˜ˆμ™Έ 처리 방법

throws둜 μœ„μž„

πŸ’‘ Exception이 λ°œμƒν•˜λŠ” λ©”μ†Œλ“œ(λ˜λŠ” μƒμ„±μž)λ₯Ό ν˜ΈμΆœν•œ μƒμœ„ λ©”μ†Œλ“œμ—κ²Œ 처리λ₯Ό μœ„μž„ν•˜λŠ” 방식이닀.

try-catch(λ˜λŠ” try-catch-finally)둜 처리

πŸ’‘ λ°œμƒν•œ Exception을 직접 μ²˜λ¦¬ν•˜λŠ” 방식이닀.

  • try λΈ”λŸ­

    • μ˜ˆμ™Έ(Exception)κ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œλ₯Ό ν¬ν•¨ν•˜μ—¬ μž‘μ„±ν•˜λŠ” λΈ”λŸ­
  • catchλΈ”λŸ­

    • try λΈ”λŸ­μ—μ„œ μ˜ˆμ™Έ λ°œμƒ μ‹œ ν•΄λ‹Ή μ˜ˆμ™Έ νƒ€μž…(Exception 클래슀 νƒ€μž…)에 λŒ€ν•œ 처리λ₯Ό κΈ°μˆ ν•˜λŠ” λΈ”λŸ­μ΄λ‹€.
    • μ—¬λŸ¬ 개의 catchλΈ”λŸ­μ„ μ΄μ–΄μ„œ μ‚¬μš©ν•  수 있으며 μƒμœ„ νƒ€μž…μ˜ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” catch λΈ”λŸ­μ΄ μ•„λž˜ μͺ½μ— μœ„μΉ˜ν•΄μ•Ό ν•œλ‹€.
  • finally λΈ”λŸ­

    • μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관 없이 κΌ­ μ‹€ν–‰λ˜μ–΄ μ²˜λ¦¬ν•΄μ•Ό ν•  μ½”λ“œκ°€ 있으면 μž‘μ„±ν•˜λŠ” λΈ”λŸ­μ΄λ‹€. 주둜 java.ioλ‚˜ java.sql νŒ¨ν‚€μ§€μ˜ λ©”μ†Œλ“œ 처리 μ‹œ μžμ› λ°˜λ‚©μ„ μœ„ν•΄ μ‚¬μš©ν•œλ‹€.

μ˜€λ²„λΌμ΄λ”© μ‹œ μ˜ˆμ™Έ λ°œμƒ κ°€λŠ₯ λ²”μœ„

  • 상속 μ‹œ μ˜€λ²„λΌμ΄λ”©ν•˜λŠ” λ©”μ†Œλ“œλŠ” λΆ€λͺ¨ 클래슀의 원본 λ©”μ†Œλ“œλ³΄λ‹€ 더 μƒμœ„ νƒ€μž…μ˜ μ˜ˆμ™Έλ₯Ό λ°œμƒ μ‹œν‚€λ©΄ μ•ˆλœλ‹€.

try-with-resource ꡬ문

  • μžλ°” 7λ²„μ „μ—μ„œ μΆ”κ°€λœ κΈ°λŠ₯으둜 μž…μΆœλ ₯μ—μ„œ μ‚¬μš©λ˜λŠ” 슀트림의 μžμ› λ°˜λ‚©(close())을 finally λΈ”λŸ­μ„ μ‚¬μš©ν•˜μ§€ μ•Šκ³  μš©μ΄ν•˜κ²Œ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λ„μž…λœ 문법이닀.
try (BufferedReader in = new BufferedReader(new FileReader("test.dat"));){
	
	String s;
	
	while((s = in.readLine()) != null){
		System.out.println(s);
	}

} catch (FileNotFoundException/* | EOFException*/ e) {
	e.printStackTrace();

} catch (IOException e) {
	e.printStackTrace();
}
profile
μ—”μ§€λ‹ˆμ–΄λ‘œμ˜ μ„±μž₯일지

0개의 λŒ“κΈ€