Back-End/Java

์ž๋ฐ”์˜ ์ •์„ 8์žฅ: ์˜ˆ์™ธ์ฒ˜๋ฆฌ

์ฑ”๐Ÿป 2024. 1. 23. 18:22
8๏ธโƒฃ

[ ์ถœ์ฒ˜ ]
์ž๋ฐ”์˜ ์ •์„:
https://product.kyobobook.co.kr/detail/S000001550352
์ž๋ฐ”์˜ ์ •์„ ์œ ํŠœ๋ธŒ:
https://www.youtube.com/playlist?list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp

8-1. ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜

๐Ÿ’ก
1) ์ปดํŒŒ์ผ ์—๋Ÿฌ(compile-time error) : ์ปดํŒŒ์ผ ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ

2) ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ(runtime error) : ์‹คํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ

3) ๋…ผ๋ฆฌ์  ์—๋Ÿฌ(logical error) : ์ž‘์„ฑ ์˜๋„์™€ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘

public class ExceptionTest {
    public static void main(String[] args) {
       system.out.println(args[0]); // ์ปดํŒŒ์ผ ์—๋Ÿฌ
    }
}

์ปดํŒŒ์ผ ์—๋Ÿฌ

์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ์— class ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•„ ์‹คํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

javac.exe : ์ž๋ฐ” ์ปดํŒŒ์ผ๋Ÿฌ

<์ปดํŒŒ์ผ๋Ÿฌ์˜ ์—ญํ• >

  1. ๊ตฌ๋ฌธ์ฒดํฌ : ๋ฌธ๋ฒ•์— ๋งž๋Š”์ง€ ํ™•์ธ
  1. ๋ฒˆ์—ญ : ์–˜๊ฐ€ ํ•ต์‹ฌ์ด๋‹ค.
  1. ์ตœ์ ํ™”

    ex) int i = 3 + 4;

    โ†’ int i = 7;

  1. ์ƒ๋žต๋œ ์ฝ”๋“œ ์ถ”๊ฐ€

    ex) extends Object

๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ

์ปดํŒŒ์ผ์€ ๋˜์—ˆ์ง€๋งŒ ์‹คํ–‰ ๋„์ค‘์— ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ด ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋œ๋‹ค.

๋ฌธ๋ฒ•์—๋Š” ๋งž์ง€๋งŒ JVM์ด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋‹ค๋ณด๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

compile-time์€ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค ์ฒดํฌํ•  ์ˆ˜ ์—†๋‹ค. ๊ธฐ๋ณธ์ ์ธ ๊ฒƒ๋งŒ ์ฒดํฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ํ•  ๋•Œ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋‹ค๊ณ  ์‹คํ–‰ ์‹œ์— ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค.

๋…ผ๋ฆฌ์  ์—๋Ÿฌ

ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ X ๋‚ด๊ฐ€ ์›ํ•˜๋Š”, ์˜๋„ํ•œ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

ex) ์žฌ๊ณ ๊ด€๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์žฌ๊ณ ๊ฐ€ ์Œ์ˆ˜๋กœ ๋ณด์—ฌ์ง

Java์˜ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ

๐Ÿ’ก
์—๋Ÿฌ(error) : ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์— ์˜ํ•ด์„œ ์ˆ˜์Šต๋  ์ˆ˜ ์—†๋Š” ์‹ฌ๊ฐํ•œ ์˜ค๋ฅ˜

์˜ˆ์™ธ(exception) : ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์— ์˜ํ•ด์„œ ์ˆ˜์Šต๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค์†Œ ๋ฏธ์•ฝํ•œ ์˜ค๋ฅ˜

์—๋Ÿฌ(error)๋Š” ์–ด์ฉ” ์ˆ˜ ์—†์ง€๋งŒ, ์˜ˆ์™ธ(exception)๋Š” ์ฒ˜๋ฆฌํ•˜์ž.

์˜ˆ์™ธ์ฒ˜๋ฆฌ(exception handling)์˜ ์ •์˜์™€ ๋ชฉ์ 

๐Ÿ’ก
์ •์˜ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ์— ๋ฐœ์ƒ์— ๋Œ€๋น„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ

๋ชฉ์  ํ”„๋กœ๊ทธ๋žจ์˜ ๋น„์ •์ƒ ์ข…๋ฃŒ๋ฅผ ๋ง‰๊ณ , ์ •์ƒ์ ์ธ ์‹คํ–‰์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ

8-2 ์˜ˆ์™ธ ํด๋ž˜์Šค์˜ ๊ณ„์ธต ๊ตฌ์กฐ

8-3 Exception๊ณผ RuntimeException

๐Ÿ’ก
Exception๊ณผ ๊ทธ ์ž์†๋“ค : ์‚ฌ์šฉ์ž์˜ ์‹ค์ˆ˜์™€ ๊ฐ™์€ ์™ธ์ ์ธ ์š”์ธ์— ์˜ํ•ด ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ

RuntimeException๊ณผ ๊ทธ ์ž์†๋“ค : ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์‹ค์ˆ˜๋กœ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ

* ์ •๋ฆฌ

8-4 ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•˜๊ธฐ, try-catch๋ฌธ

๐Ÿ’ก
์˜ˆ์™ธ์ฒ˜๋ฆฌ(exception handling)์˜

์ •์˜ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ์— ๋Œ€๋น„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ

๋ชฉ์  ํ”„๋กœ๊ทธ๋žจ์˜ ๋น„์ •์ƒ ์ข…๋ฃŒ๋ฅผ ๋ง‰๊ณ , ์ •์ƒ์ ์ธ ์‹คํ–‰์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ

try {
	// ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ฌธ์žฅ๋“ค์„ ๋„ฃ๋Š”๋‹ค.
} catch (Exception e1) {
	// Exception1์ด ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ, ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์žฅ์„ ์ ๋Š”๋‹ค.
} catch (Exception e2) {
	// Exception2์ด ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ, ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์žฅ์„ ์ ๋Š”๋‹ค.
} catch (Exception eN) {
	// ExceptionN์ด ๋ฐœ์ƒํ–ˆ์„ ๊ฒฝ์šฐ, ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฌธ์žฅ์„ ์ ๋Š”๋‹ค.
}

๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— catch ๋ธ”๋Ÿญ์€ ์—ฌ๋Ÿฌ๊ฐœ ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

8-5 try-catch๋ฌธ์—์„œ์˜ ํ๋ฆ„

  1. try๋ธ”๋Ÿญ ๋‚ด์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ,

    1) ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์™€ ์ผ์น˜ํ•˜๋Š” catch ๋ธ”๋Ÿญ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

    2) ์ผ์น˜ํ•˜๋Š” catch ๋ธ”๋Ÿญ์„ ์ฐพ๊ฒŒ ๋˜๋ฉด, ๊ทธ catch ๋ธ”๋Ÿญ ๋‚ด์˜ ๋ฌธ์žฅ๋“ค์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์ „์ฒด try-catch ๋ฌธ์„ ๋น ์ ธ๋‚˜๊ฐ€์„œ ๊ทธ ๋‹ค์Œ ๋ฌธ์žฅ์„ ๊ณ„์†ํ•ด์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค. ๋งŒ์ผ ์ผ์น˜ํ•˜๋Š” catch ๋ธ”๋Ÿญ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด, ์˜ˆ์™ธ๋Š” ์ฒ˜๋ฆฌ๋˜์ง€ ๋ชปํ•œ๋‹ค.

  1. try๋ธ”๋Ÿญ ๋‚ด์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ,

    1) catch ๋ธ”๋Ÿญ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์ „์ฒด try-catch๋ฌธ์„ ๋น ์ ธ๋‚˜๊ฐ€์„œ ์ˆ˜ํ–‰์„ ๊ณ„์†ํ•œ๋‹ค.

class Ex8_1 {
    public static void main(String[] args) {
        System.out.println(1);

        try {
            System.out.println(2);
            System.out.println(3);
        } catch (Exception e) {
            System.out.println(4);
        } // try-catch์˜ ๋
        
        System.out.println(5);
    }
}

// ========== ์‹คํ–‰๊ฒฐ๊ณผ ============ //
1
2
3
4
class Ex8_1 {
    public static void main(String[] args) {
        System.out.println(1);

        try {
            System.out.println(0/0); // ์˜ˆ์™ธ๋ฐœ์ƒ
            System.out.println(2);
        } catch (ArithmeticException ae) {
            System.out.println(3);
        } // try-catch์˜ ๋

        System.out.println(4);
    }
}

// ========== ์‹คํ–‰๊ฒฐ๊ณผ ============ //
1
3
4

8-6 ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ๊ณผ catch๋ธ”๋Ÿญ

  • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  catch๋ธ”๋Ÿญ์„ ์ฐพ์•„ ๋‚ด๋ ค๊ฐ
  • ์ผ์น˜ํ•˜๋Š” catch๋ธ”๋Ÿญ์ด ์—†์œผ๋ฉด, ์˜ˆ์™ธ๋Š” ์ฒ˜๋ฆฌ ์•ˆ๋จ
  • Exception์ด ์„ ์–ธ๋œ catch๋ธ”๋Ÿญ์€ ๋ชจ๋“  ์˜ˆ์™ธ ์ฒ˜๋ฆฌ(๋งˆ์ง€๋ง‰ catch๋ธ”๋Ÿญ)
class Ex8_4 {
    public static void main(String[] args) {
        System.out.println(1);
        System.out.println(2);

        try {
            System.out.println(3);
            System.out.println(0/0); // 0์œผ๋กœ ๋‚˜๋ˆ ์„œ ๊ณ ์˜๋กœ ArithmeticException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
            System.out.println(4);   // ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
        } catch (ArithmeticException ae) {
            if(ae instanceof ArithmeticException)
                System.out.println("true");
            System.out.println("ArithmeticException");
        } catch (Exception e) {      // ArithmeticException์„ ์ œ์™ธํ•œ ๋ชจ๋“  ์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋œ๋‹ค.
            System.out.println("Exception");
        }
        System.out.println(6);
    }
}

8-7 printStackTrace()์™€ getMessage()

๐Ÿ’ก
printStackTrace() ์˜ˆ์™ธ๋ฐœ์ƒ ๋‹น์‹œ์˜ ํ˜ธ์ถœ์Šคํƒ(Call Stack)์— ์žˆ์—ˆ๋˜ ๋ฉ”์„œ๋“œ์˜ ์ •๋ณด์™€
์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๋ฅผ ํ™”๋ฉด์— ์ถœ๋ ฅํ•œ๋‹ค.

getMessage() ๋ฐœ์ƒํ•œ ์˜ˆ์™ธํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์— ์ €์žฅ๋œ ๋ฉ”์‹œ์ง€๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ์™ธ ๋ฐœ์ƒ ์‹œ ์˜ˆ์™ธ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ด ๊ฐ์ฒด์—๋Š” ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋“ค์–ด์žˆ๋‹ค. printStackTrace()๊ณผ getMessage()๊ฐ™์€ ๋ฉ”์„œ๋“œ๋“ค์„ ํ†ตํ•ด ์ด ์ •๋ณด๋“ค์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

8-8 ๋ฉ€ํ‹ฐ catch ๋ธ”๋Ÿญ

  • ๋‚ด์šฉ์ด ๊ฐ™์€ catch ๋ธ”๋Ÿญ์„ ํ•˜๋‚˜๋กœ ํ•ฉ์นœ ๊ฒƒ(JDK 1.7๋ถ€ํ„ฐ)
try {
					...
} catch (Exception e) {
	e.printStackTrace();
} catch (ExceptionB e2) {
	e.printStackTrace();
}

โ†’

try {
					...
	// ๋‚ด์šฉ ๋™์ผ ์ค‘๋ณต ์ œ๊ฑฐ
} catch (Exception | ExceptinoB e) {
	e.printStackTrace();
}

Example case1

๋ถ€๋ชจ ์ž์‹ ๊ด€๊ณ„์˜ catch ๋ธ”๋Ÿญ์€ ๋ฉ€ํ‹ฐ catch ๋ธ”๋Ÿญ ์‚ฌ์šฉ ๋ถˆ๊ฐ€

try {
		...
// } catch (ParentException | ChildExcpetion e) { // ์—๋Ÿฌ!
} catch (ParentException e) {
		e.printStackException();
}

Example case2

ExceptionA์™€ ExceptionB์˜ ๊ณตํ†ต๋ฉค๋ฒ„๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

try {

} catch (Exception A | ExceptionB e) {
		e.methodA(); // ์—๋Ÿฌ. ExceptionA์— ์„ ์–ธ๋œ methodA()๋Š” ํ˜ธ์ถœ๋ถˆ๊ฐ€

	if(e instanceof ExceptionA) {
			ExceptionA e1 = (ExceptionA)e;
			e1.methodA(); // OK. ExceptionA์— ์„ ์–ธ๋œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๊ฐ€๋Šฅ
	} else { // if(e instanceof ExceptionB)
			...
	}

}

8-9 ์˜ˆ์™ธ ๋ฐœ์ƒ์‹œํ‚ค๊ธฐ

  1. ์—ฐ์‚ฐ์ž new๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐœ์ƒ์‹œํ‚ค๋ ค๋Š” ์˜ˆ์™ธ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“  ๋‹ค์Œ

    Exception e = new Exception(โ€๊ณ ์˜๋กœ ๋ฐœ์ƒ์‹œ์ผฐ์Œโ€);

  1. ํ‚ค์›Œ๋“œ throw๋ฅผ ์ด์šฉํ•ด์„œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

    throw e;

// ์˜ˆ์ œ 8-6
public class Ex8_6 {
    public static void main(String[] args) {
        
        try {
            Exception e = new Exception("๊ณ ์˜๋กœ ๋ฐœ์ƒ์‹œ์ผฐ์Œ");
            throw e;
            // throw new Exception("๊ณ ์˜๋กœ ๋ฐœ์ƒ์‹œ์ผฐ์Œ");

        } catch (Exception e) {
            System.out.println("์—๋Ÿฌ ๋ฉ”์‹œ์ง€ : " + e.getMessage());
            e.printStackTrace();
        }
        System.out.println("ํ”„๋กœ๊ทธ๋žจ์ด ์ •์ƒ ์ข…๋ฃŒ๋˜์—ˆ์Œ");

    }
}

8-10 checked ์˜ˆ์™ธ, unchecked ์˜ˆ์™ธ

  • checked ์˜ˆ์™ธ : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌ(์˜ˆ์™ธ ์ฒ˜๋ฆฌ ํ•„์ˆ˜)
  • unchecked ์˜ˆ์™ธ : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌ ์•ˆํ•จ(์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์„ ํƒ)

RuntimeException๊ณผ ๊ทธ ์ž์†๋“ค์ด unchecked ์˜ˆ์™ธ์ธ ์ด์œ 

try {
    int[] arr = new int[10];
    System.out.println(arr[0]);

} catch (ArrayIndexOutOfBoundsException ae) {

} catch(NullPointerException ne) {
    
}

๋ชจ๋“  ์ฐธ์กฐ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ NPE๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ณ  ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ ArrayIndexOutOfBoundsException๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ „๋ถ€ try catch๋กœ ๋ฌถ์–ด์ค˜์•ผ ํ•œ๋‹ค.

๊ทธ๋ž˜์„œ RuntimeException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋“ค์€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€๋‹ค. ์ด๊ฒƒ์ด ํ•„์ˆ˜๊ฐ€ ๋  ๊ฒฝ์šฐ ๊ฑฐ์˜ ๋ชจ๋“  ์ฝ”๋“œ์— try catch๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ

// ์˜ˆ์ œ 8-7
try {
    // Exception๊ณผ ๊ทธ ์ž์†์€ ๋ฐ˜๋“œ์‹œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.(ํ•„์ˆ˜)
    throw new Exception(); // Exception์„ ๊ณ ์˜๋กœ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
    
} catch (Exception e) {

}

// RuntimeException๊ณผ ๊ทธ ์ž์†์€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์ง€ ์•Š์•„๋„ ์ปดํŒŒ์ผ์ด ๋œ๋‹ค.
throw new RuntimeException();

8-11 ๋ฉ”์„œ๋“œ์— ์˜ˆ์™ธ ์„ ์–ธํ•˜๊ธฐ

  • ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•
    1. try-catch๋ฌธ(์ง์ ‘์ฒ˜๋ฆฌ)
    1. ์˜ˆ์™ธ ์„ ์–ธํ•˜๊ธฐ(๋– ๋„˜๊ธฐ๊ธฐ, ์•Œ๋ฆฌ๊ธฐ)
  • ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœ ์‹œ ๋ฐœ์ƒ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ชฝ์— ์•Œ๋ฆฌ๋Š” ๊ฒƒ

throw : ์˜ˆ์™ธ ๋ฐœ์ƒ ํ‚ค์›Œ๋“œ

throws : ์˜ˆ์™ธ๋ฅผ ๋ฉ”์„œ๋“œ์— ์„ ์–ธ ์‹œ ์“ฐ์ด๋Š” ํ‚ค์›Œ๋“œ

๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ๋Š” 2๊ฐ€์ง€์ธ๋ฐ ์™œ ์˜ˆ์™ธ ์„ ์–ธ์€ 1๊ฐ€์ง€๋งŒ ํ•˜์˜€๋Š”์ง€?

IllegalMonitorStateException์ด RuntimeException(unchecked ์˜ˆ์™ธ, ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์„ ํƒ)์˜ ์ž์†์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

InterruptedException์€ Exception(checked ์˜ˆ์™ธ, ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•„์ˆ˜)์˜ ์ž์†์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฉ”์„œ๋“œ์— ์˜ˆ์™ธ ์„ ์–ธ ์‹œ checked, unchecked ์˜ˆ์™ธ๋ฅผ ๋‘˜ ๋‹ค ์ ์–ด๋„ ๋˜์ง€๋งŒ, ์˜ˆ์™ธ์„ ์–ธ์€ checked๋งŒ ์ ๋Š” ๊ฒƒ์ด ์ •์„์ด๋‹ค. unchecked๋Š” ์ ์ง€ ์•Š์Œ

// ์˜ˆ์ œ 8-9
class Ex8_9 {
	public static void main(String[] args) throws Exception {
		method1();	 // ๊ฐ™์€ ํด๋ž˜์Šค๋‚ด์˜ static๋ฉค๋ฒ„์ด๋ฏ€๋กœ ๊ฐ์ฒด์ƒ์„ฑ์—†์ด ์ง์ ‘ ํ˜ธ์ถœ๊ฐ€๋Šฅ.
  	}	// main๋ฉ”์„œ๋“œ์˜ ๋

	static void method1() throws Exception {
		method2();
	}	// method1์˜ ๋

	static void method2() throws Exception {
		throw new Exception();
	}	// method2์˜ ๋
}
// ๊ฒฐ๊ณผ
Exception in thread "main" java.lang.Exception
	at Ex8_9.method2(Ex8_9.java:11)
	at Ex8_9.method1(Ex8_9.java:7)
	at Ex8_9.main(Ex8_9.java:3)

์œ„๋Š” JVM์˜ ๊ธฐ๋ณธ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ์ถœ๋ ฅํ•œ ๋‚ด์šฉ์ด๋‹ค.(printStackTrace();) โ†’ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ ๋‹น์‹œ์˜ ๋‚ด์šฉ์ด ๋‹ด๊ฒจ์žˆ๋‹ค.

์˜ˆ์™ธ ์„ ์–ธ์€ ์ž์‹ ์„ ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์—๊ฒŒ ์˜ˆ์™ธ๋ฅผ ๋– ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด์ง€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๋ ค๋ฉด try-catch๋ฌธ์ด ์žˆ์–ด์•ผํ•œ๋‹ค.

// ์˜ˆ์ œ 8-10 
class Ex8_10 {
	public static void main(String[] args) {
		try {
			File f = createFile(args[0]);
			System.out.println( f.getName()+"ํŒŒ์ผ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
		} catch (Exception e) {
			System.out.println(e.getMessage()+" ๋‹ค์‹œ ์ž…๋ ฅํ•ด ์ฃผ์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.");
		}
	}	// main๋ฉ”์„œ๋“œ์˜ ๋

	static File createFile(String fileName) throws Exception {
		if (fileName==null || fileName.equals(""))
			throw new Exception("ํŒŒ์ผ์ด๋ฆ„์ด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.");
		File f = new File(fileName);		//  Fileํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ ๋‹ค.
     	// File๊ฐ์ฒด์˜ createNewFile๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉํ•ด์„œ ์‹ค์ œ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค.
		f.createNewFile();
		return f;		// ์ƒ์„ฑ๋œ ๊ฐ์ฒด์˜ ์ฐธ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
	}	// createFile๋ฉ”์„œ๋“œ์˜ ๋
}	// ํด๋ž˜์Šค์˜ ๋

์ด ์˜ˆ์™ธ๋Š” ์ž‘์—…์„ ์‹œํ‚จ ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒŒ ๋งž๋Š”์ง€, ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋งž๋Š” ๊ฑด์ง€์— ๋”ฐ๋ผ try-catch ๋ธ”๋Ÿญ์„ ์–ด๋””์— ๋†“์„์ง€ ๊ฒฐ์ •ํ•˜๋ฉด ๋œ๋‹ค.

8-14 finally ๋ธ”๋Ÿญ

  • ์˜ˆ์™ธ ๋ฐœ์ƒ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š”๋‹ค.
try {
	// ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๋ฌธ์žฅ๋“ค์„ ๋„ฃ๋Š”๋‹ค.
} catch (Exception e1) {
	// ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ๋ฌธ์žฅ์„ ์ ๋Š”๋‹ค.
} finally {
	// ์˜ˆ์™ธ์˜ ๋ฐœ์ƒ์—ฌ๋ถ€์— ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ์ˆ˜ํ–‰๋˜์–ด์•ผํ•˜๋Š” ๋ฌธ์žฅ๋“ค์„ ๋„ฃ๋Š”๋‹ค.
	// finally ๋ธ”๋Ÿญ์€ try-catch ๋ฌธ์˜ ๋งจ ๋งˆ์ง€๋ง‰์— ์œ„์น˜ํ•ด์•ผํ•œ๋‹ค.
}
try {
	startInstall();
	copyFiles();
	deleteTempFiles(); // ์ฝ”๋“œ ์ค‘๋ณต

} catch (Exception e) {
	e.printStackTrace();
	deleteTempFiles(); // ์ฝ”๋“œ ์ค‘๋ณต
} // try-catch์˜ ๋

์„ค์น˜๊ฐ€ ์ž˜ ๋ผ๋„ ์ž„์‹œํŒŒ์ผ์„ ์‚ญ์ œํ•ด์•ผ ํ•˜๊ณ  ์„ค์น˜ ์ค‘๊ฐ„์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ์ž„์‹œํŒŒ์ผ์€ ์‚ญ์ œ๋˜์–ด์•ผ ํ•œ๋‹ค.

โ†’

try {
	startInstall();
	copyFiles();

} catch (Exception e) {
	e.printStackTrace();

} finally {
	deleteTempFiles(); // ์ฝ”๋“œ ์ค‘๋ณต ์ œ๊ฑฐ
} // try-catch์˜ ๋

์ž๋™ ์ž์› ๋ฐ˜ํ™˜ - try-with-resources๋ฌธ

try (FileInputStream fis = new FileInputStream("score.dat");
		 DataInputStream dis = new DataInputStream(fis)) {
		while (true) {
			score = dis.readInt();
			System.out.println(score);
			sum += socre;
		}
} catch (EOFException e) {
		System.out.println("์ ์ˆ˜์˜ ์ดํ•ฉ์€ " + sum + "์ž…๋‹ˆ๋‹ค.");
} catch (IOException ie) {
		ie.printStackTrace();
}

try-with-resources ๋ฌธ์˜ ๊ด„ํ˜ธ()์•ˆ์— ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์žฅ์„ ๋„ฃ์œผ๋ฉด, try ๋ธ”๋Ÿญ์„ ๋ฒ—์–ด๋‚˜๋Š” ์ˆœ๊ฐ„ ์ž๋™์ ์œผ๋กœ close()๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. ๊ทธ ๋‹ค์Œ์— catch๋ธ”๋Ÿญ ๋˜๋Š” finally ๋ธ”๋ฝ์ด ์ˆ˜ํ–‰๋œ๋‹ค.

I/O ๊ด€๋ จ ํด๋ž˜์Šค ์‚ฌ์šฉ์‹œ ์œ ์šฉํ•จ

์ž๋ฐ”์—์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์„ค๋ช…๊ณผ, ์˜ˆ์™ธ ๋˜๋˜์ง€๊ธฐ, ์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ๋Š” ์—ฌ๋Ÿฌ ์˜ˆ์™ธ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ checked ์˜ˆ์™ธ๋ฅผ unchecked ์˜ˆ์™ธ๋กœ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค. ์—ฐ์Šต๋ฌธ์ œ๋„ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค.

์ž๋ฐ”์—์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•œ ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค. ์˜ˆ์™ธ ๋˜๋˜์ง€๊ธฐ์™€ ์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ๋‚ด์šฉ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ์Šต๋ฌธ์ œ๋„ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

8-15 ์‚ฌ์šฉ์ž ์ •์˜ ์˜ˆ์™ธ ๋งŒ๋“ค๊ธฐ

  • ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ์˜ˆ์™ธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์กฐ์ƒ์€ Exception๊ณผ RuntimeException์ค‘์—์„œ ์„ ํƒ

์„ ํƒ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉด RuntimeException์„ ์กฐ์ƒ์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

class MyException extends Exception { // ํ•„์ˆ˜์ฒ˜๋ฆฌ ์˜ˆ์™ธ
	MyException(String msg) { // ๋ฌธ์ž๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š” ์ƒ์„ฑ์ž
		super(msg);             // ์กฐ์ƒ์ธ Exception ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
	}
}

<๊ทœ์น™, ํฌ์ธํŠธ>

  1. Exception๊ณผ RuntimeException ์ค‘์—์„œ ์กฐ์ƒ์„ ์„ ํƒํ•œ๋‹ค.
  1. String ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ ๋‹ค.

8-17 ์˜ˆ์™ธ ๋˜๋˜์ง€๊ธฐ(exception re-throwing)

  • ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•œ ํ›„์— ๋‹ค์‹œ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ
  • ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์™€ ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ ์–‘์ชฝ ๋ชจ๋‘์—์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ
public class Ex8_12 {
    public static void main(String[] args) {
        try {
            method1();
        } catch (Exception e) { // 4. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
            System.out.println("main ๋ฉ”์„œ๋“œ์—์„œ ์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
        }
    }

    static void method1() throws Exception {
        try {
            throw new Exception(); // 1. ์˜ˆ์™ธ ๋ฐœ์ƒ
        } catch (Exception e) { // 2. ์˜ˆ์™ธ ์ฒ˜๋ฆฌ
            System.out.println("method1 ๋ฉ”์„œ๋“œ์—์„œ ์˜ˆ์™ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
            throw e; // 3. ๋‹ค์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ
        }
    }
}

<์˜ˆ์™ธ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•>

  1. ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ์—์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
  1. ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์—์„œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ
  1. ํ˜ธ์ถœํ•œ ๋ฉ”์„œ๋“œ์™€ ํ˜ธ์ถœ๋œ ๋ฉ”์„œ๋“œ ์–‘์ชฝ์—์„œ ๋ชจ๋‘ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

8-18 ์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ(chained exception)

  • ํ•œ ์˜ˆ์™ธ๊ฐ€ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.
  • ์˜ˆ์™ธ A๊ฐ€ ์˜ˆ์™ธ B๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋ฉด A๋Š” B์˜ ์›์ธ ์˜ˆ์™ธ(cause exception)

A์™€ B๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ๋ผ๊ณ  ํ•œ๋‹ค. ์ด ๋‘˜์„ ์—ฐ๊ฒฐ์‹œํ‚ค๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ๊ฐ€ initCause()๋‹ค.

๐Ÿ’ก
Throwable initCause(Throwable cause) ์ง€์ •ํ•œ ์˜ˆ์™ธ๋ฅผ ์›์ธ ์˜ˆ์™ธ๋กœ ๋“ฑ๋ก

Throwable getCause() ์›์ธ ์˜ˆ์™ธ๋ฅผ ๋ฐ˜ํ™˜

Throwable์€ Exception๊ณผ Error์˜ ์กฐ์ƒ ํด๋ž˜์Šค

public class Throwable implements Serializable {
	...
	// ์›์ธ ์˜ˆ์™ธ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ iv
	private Throwable cause = this; // ๊ฐ์ฒด ์ž์‹ (this)์„ ์›์ธ ์˜ˆ์™ธ๋กœ ๋“ฑ๋ก
	...
	public synchronized Throwable initCause(Throwable cuase) {
		...
		this.cuase = cause; // cause๋ฅผ ์›์ธ ์˜ˆ์™ธ๋กœ ๋“ฑ๋ก
		return this;
	}
		...
}

์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ : ํ•˜๋‚˜์˜ ์˜ˆ์™ธ ์•ˆ์— ๋˜ ๋‹ค๋ฅธ ์˜ˆ์™ธ๋ฅผ ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ

์˜ˆ์™ธ A๊ฐ€ B๋ผ๋Š” ์˜ˆ์™ธ๋ฅผ ๋งŒ๋“ฆ

์›์ธ ์˜ˆ์™ธ : A

์‹ค์ œ๋กœ ๋ฐœ์ƒํ•œ ๊ฒƒ์€ SpaceException์ธ๋ฐ InstallException๋ฅผ ๋งŒ๋“ค์–ด ๊ทธ ์•ˆ์— ๋„ฃ์–ด์ค€ ๊ฒƒ ์ด๋Ÿด ๋•Œ ๋‘ ์˜ˆ์™ธ๋ฅผ ์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ๋ผ๊ณ  ํ•œ๋‹ค.

[์ด์œ 1] ์—ฌ๋Ÿฌ ์˜ˆ์™ธ๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ

try {
	install();
} catch(SpaceException e) {
	e.printStackTrace();
} catch(MemoryException e) {
	e.printStackTrace();
} catch(Exception e) {
	e.printStackTrace();
} // catch ๋ธ”๋ฝ์ด ๋„ˆ๋ฌด ๋งŽ์•„์ง

โ†’

try {
	install();
} catch(InstallException e) {
	e.printStackTrace();
} catch(Exception e) {
	e.printStackTrace();
}
void install() throws InstallException {
	try {
		startInstall();  // SpaceException(์ €์žฅ๊ณต๊ฐ„ ๋ถ€์กฑ) ๋ฐœ์ƒ
		copyFiles();
	} catch (SpaceExceptioin e) { // ์˜ˆ์™ธ A
			InstallException ie = new InstallException("์„ค์น˜์ค‘ ์˜ˆ์™ธ๋ฐœ์ƒ"); // ์˜ˆ์™ธ B ์ƒ์„ฑ
			ie.initCause(e); // InstallException์˜ ์›์ธ ์˜ˆ์™ธ๋ฅผ SpaceException์œผ๋กœ ์ง€์ •
			throw ie;        // InstallException์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.
	} catch(MemoryException me) {
			InstallException ie = new InstallException("์„ค์น˜์ค‘ ์˜ˆ์™ธ๋ฐœ์ƒ");
			ie.initCause(e);
			throw ie;
	}
}

์„ธ๋ถ€์ ์ธ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋Š” ์•ˆ์œผ๋กœ ์ง‘์–ด๋†“๊ณ  InstallException ํ•˜๋‚˜๋งŒ ๋˜์ง€๋„๋ก ์„ ์–ธํ•œ ๊ฒƒ์ด๋‹ค.

์œ„์—์„œ๋Š” ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๊ฒƒ์ด ์•„๋‹Œ ๋‘ ์˜ˆ์™ธ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ž‘์—…๋งŒ ํ•œ ๊ฒƒ์ด๋‹ค.

์ฒ˜๋ฆฌํ•˜๋Š” ์ชฝ์—์„œ๋„ ์„ธ๋ถ€์ ์ธ ์˜ˆ์™ธ๋ฅผ ๋ฉ”์„œ๋“œ ์•ˆ์œผ๋กœ ๊ฐ์ถœ ์ˆ˜ ์žˆ์–ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ„๋‹จํ•ด์ง„๋‹ค.

[์ด์œ 2] checked ์˜ˆ์™ธ๋ฅผ unchecked ์˜ˆ์™ธ๋กœ ๋ณ€๊ฒฝํ•˜๋ ค ํ•  ๋•Œ

checked ์˜ˆ์™ธ๋ฅผ unchecked ์˜ˆ์™ธ๋กœ ๋ฐ”๊พธ๋Š” ์ด์œ ?

โ†’ checked ์˜ˆ์™ธ๋Š” try-catch ๋ธ”๋Ÿญ์œผ๋กœ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๋ฐ˜๋“œ์‹œ ํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๋Š” ๋“ฑ ๋ถˆํŽธํ•œ ์ ์ด ์žˆ์Œ

static void startInstall() throws SpaceException, MemoryException {
	if(!enoughSpace())
		throw new SpaceException("์„ค์น˜ํ•  ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.");
	
	if(!enoughMemory())
		throw new MemoryException("๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.");
}

class SpaceException extends Exception { // Exception == checked ์˜ˆ์™ธ
	SpaceException(String msg) {
		super(msg);
	}
}

SpaceException์€ Exception์˜ ์ž์†์ด๊ธฐ ๋•Œ๋ฌธ์— checked ์˜ˆ์™ธ์ด๋‹ค. unchecked ์˜ˆ์™ธ๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์–ด๋„ SpaceException์ด ์ด๋ฏธ ๋งŽ์ด ์‚ฌ์šฉ๋˜์–ด์ง€๊ณ  ์žˆ์„ ๊ฒฝ์šฐ ์ƒ์† ๊ณ„์ธต๋„๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ์‰ฌ์šด ์ž‘์—…์ด ์•„๋‹ˆ๋‹ค. ์ด๋Ÿด ๋•Œ ์—ฐ๊ฒฐ๋œ ์˜ˆ์™ธ๋ฅผ ์ด์šฉํ•ด ๋ณ€๊ฒฝํ•œ๋‹ค.

โฌ‡๏ธ

static void startInstall() throws SpaceException {
	if(!enoughSpace())  // ์ถฉ๋ถ„ํ•œ ์„ค์น˜ ๊ณต๊ฐ„์ด ์—†์œผ๋ฉด...
		throw new SpaceException("์„ค์น˜ํ•  ๊ณต๊ฐ„์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.");
	
	if(!enoughMemory()) // ์ถฉ๋ถ„ํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†์œผ๋ฉด...
		throw new RuntimeException(new MemoryException("๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.")); // ํ•„์ˆ˜ -> ์„ ํƒ, RuntimeException์„ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— ์›์ธ ์˜ˆ์™ธ๋กœ ๋“ฑ๋ก

}


์—ฐ์Šต๋ฌธ์ œ

8-1 ์˜ˆ์™ธ์ฒ˜๋ฆฌ์˜ ์ •์˜์™€ ๋ชฉ์ ์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค

์—„โ€ฆโ€ฆโ€ฆโ€ฆโ€ฆโ€ฆ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋Š”

์ผ๋‹จ ์˜ˆ์™ธ(Exception)๋Š”

  1. Exception๊ณผ ๊ทธ ์ž์†๋“ค
  1. RuntimeException๊ณผ ๊ทธ ์ž์†๋“ค

์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋‹ค.

๋ชฉ์  : ํ”„๋กœ๊ทธ๋žจ์˜ ๋น„์ •์ƒ์ ์ธ ์ข…๋ฃŒ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ

๐Ÿ’ก
์ •์˜ - ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ˆ์™ธ์— ๋ฐœ์ƒ์— ๋Œ€๋น„ํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ
๋ชฉ์  - ํ”„๋กœ๊ทธ๋žจ์˜ ๋น„์ •์ƒ ์ข…๋ฃŒ๋ฅผ ๋ง‰๊ณ , ์ •์ƒ์ ์ธ ์‹คํ–‰์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ

8-2

๋‹ต : 4๋ฒˆ

??? 8-3

๋‹ต :

์˜ค๋ฒ„๋ผ์ด๋”ฉ ๊ทœ์น™ : ์กฐ์ƒ๋ณด๋‹ค ๋งŽ์€ ์˜ˆ์™ธ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์—†๋‹ค.

4) Exception์€ ๋ชจ๋“  ์˜ˆ์™ธ์˜ ์กฐ์ƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์˜ˆ์™ธ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด ์กฐ์ƒ๋ณด๋‹ค ์˜ˆ์™ธ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„ ์•ˆ๋จ

5) NumberException๊นŒ์ง€ ํฌํ•จํ•ด์„œ ์ด ์˜ˆ์™ธ๊ฐ€ 3๊ฐœ๋ผ ์กฐ์ƒ๋ณด๋‹ค ๋งŽ์•„(2๊ฐœ) ์•ˆ๋จ

8-4

1
3
5

1
2
5
6

8-5

3
5

8-6 ??

1

1
2
5
6

8-7

import java.util.InputMismatchException;
import java.util.Scanner;

public class Exercise8_7 {
    public static void main(String[] args) {
        int answer = (int) (Math.random() * 100) +1;
        int input = 0;
        int count = 0;

        do {
            count++;
            System.out.println("1๊ณผ 100์‚ฌ์ด์˜ ๊ฐ’์„ ์ž…๋ ฅํ•˜์„ธ์š” : ");
            try {
                input = new Scanner(System.in).nextInt();

            } catch(InputMismatchException e) {
                continue;
            }

            if(input < answer) {
                System.out.println("๋” ํฐ ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.");
            }
            else if(answer < input) {
                System.out.println("๋” ์ž‘์€ ์ˆ˜๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.");
            }
            else {
                System.out.println("๋งž์ท„์Šต๋‹ˆ๋‹ค.");
                System.out.println("์‹œ๋„ํšŸ์ˆ˜๋Š” " + count + "๋ฒˆ์ž…๋‹ˆ๋‹ค.");
                break; // do-while๋ฌธ์„ ๋ฒ—์–ด๋‚œ๋‹ค.4
            }
                

        } while(true);
    }
}

8-8

2
4
7


Uploaded by N2T