Java

Java ์—์„œ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

hyunki.Dev 2023. 6. 3. 15:59

๐Ÿ“Œ ๋“ค์–ด๊ฐ€๋ฉฐ

 ๊ฐœ๋ฐœ์„ ํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ฝ‘์œผ๋ผ๋ฉด '์˜ˆ์™ธ์ฒ˜๋ฆฌ' ๋ฅผ ๋“ค ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ณผ์ •์—์„  ์˜ˆ์™ธ Exception์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ  ํ•ด๋‹น Exception์„ ์–ผ๋งˆ๋‚˜ ์„ธ๋ถ„ํ™” ํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ๋˜๋Š” Exception์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋Œ€์ฒ˜ํ•  ๊ฒƒ ์ธ์ง€๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•œ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ํฌ์ŠคํŒ…์—์„œ๋Š” Java์—์„œ Exception์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. 


๐Ÿ“Œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•˜๊ธฐ

์˜ˆ์™ธ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” try - catch ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” Exception ์„ throw(์˜ˆ์™ธ ๋˜์ง€๊ธฐ) ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. 

 

try {
    ...
} catch(์˜ˆ์™ธ1) {
    ...
} catch(์˜ˆ์™ธ2) {
    ...
}

 

 try ๋ฌธ์•ˆ์˜ ์ˆ˜ํ–‰ํ•  ๋ฌธ์žฅ๋“ค์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด catch๋ฌธ์— ์†ํ•œ ๋ฌธ์žฅ๋“ค์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ try ๋ฌธ์•ˆ์˜ ๋ฌธ์žฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋„์ค‘์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์˜ˆ์™ธ์— ํ•ด๋‹น๋˜๋Š” catch๋ฌธ์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ˆซ์ž๋ฅผ 0์œผ๋กœ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

int c;
try {
    c = 4 / 0;
} catch(ArithmeticException e) {
    log.error("์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์œผ๋ฏ€๋กœ c์— -1 ๊ฐ’์„ ํ• ๋‹นํ•˜๋นˆ๋‹ค.")
    c = -1;  // ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ์ด ๋ฌธ์žฅ์ด ์ˆ˜ํ–‰๋œ๋‹ค.
}

 ArithmeticException์ด ๋ฐœ์ƒํ•˜๋ฉด c์— -1์„ ๋Œ€์ž…ํ•˜๋„๋ก ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ArithmeticException e์—์„œ e๋Š” ArithmeticException ํด๋ž˜์Šค์˜ ๊ฐ์ฒด, ์ฆ‰ ์˜ค๋ฅ˜ ๊ฐ์ฒด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ์˜ˆ์™ธ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ• ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” try ๊ตฌ๋ฌธ์—์„œ ์ˆ˜ํ–‰ํ•œ ๋กœ์ง์„ rollback ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

try - catch ๊ตฌ๋ฌธ๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” finally๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ 

๋ฐ˜๋“œ์‹œ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ๋กœ์ง์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

public class Sample {
    public void shouldBeRun() {
        System.out.println("ok thanks.");
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        int c;
        try {
            c = 4 / 0;
        } catch (ArithmeticException e) {
            c = -1;
        } finally {
            sample.shouldBeRun();  // ์˜ˆ์™ธ์— ์ƒ๊ด€์—†์ด ๋ฌด์กฐ๊ฑด ์ˆ˜ํ–‰
        }
    }
}

 

 

๐Ÿ“Œ Exception ๊ณผ Runtime Exception

์ž๋ฐ”์—์„œ์˜ Exception์€ checked Exception ๊ณผ unchecked Exception์œผ๋กœ ๊ตฌ๋ถ„๋˜๋Š”๋ฐ

์œ„์˜ ์ด๋ฏธ์ง€์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

RuntimeException์€ ์‹คํ–‰์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์ด๊ณ 

Exception์€ ์ปดํŒŒ์ผ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค.

์ฆ‰, Exception์€ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์‹œ ์ด๋ฏธ ์˜ˆ์ธก๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ณ 

RuntimeException์€ ๋ฐœ์ƒ ํ• ์ˆ˜๋„ ๋ฐœ์ƒ ์•ˆ ํ• ์ˆ˜๋„ ์žˆ๋Š” ๊ฒฝ์šฐ์— ์ž‘์„ฑํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ Exception์„ Checked Exception, RuntimeException์„ Unchecked Exception ์ด๋ผ๊ณ ๋„ ํ•ฉ๋‹ˆ๋‹ค.

 

RuntimeException

runtime Exception์„ ์ƒ์†๋ฐ›๋Š” custom ํ•œ exception์„ ๋ฐœ์ƒ์‹œ์ผœ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

class FoolException extends RuntimeException {
}

 

class FoolException extends RuntimeException {
}

public class Sample {
    public void sayNick(String nick) {
        if("fool".equals(nick)) {
            throw new FoolException();
        }
        System.out.println("๋‹น์‹ ์˜ ๋ณ„๋ช…์€ "+nick+" ์ž…๋‹ˆ๋‹ค.");
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        sample.sayNick("fool");
        sample.sayNick("genious");
    }
}

์ด์ œ ์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด "fool"์ด๋ผ๋Š” ์ž…๋ ฅ๊ฐ’์œผ๋กœ sayNick ๋ฉ”์„œ๋“œ ์‹คํ–‰์‹œ

๋‹ค์Œ๊ณผ ๊ฐ™์€ custom ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

Exception in thread "main" FoolException
    at Sample.sayNick(Sample.java:7)
    at Sample.main(Sample.java:14)

 

Exception

๊ทธ๋ ‡๋‹ค๋ฉด ์ด๋ฒˆ์—๋Š” FoolException์ด Exception์„ ์ƒ์†๋ฐ›๋„๋ก ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

class FoolException extends Exception {
}

 

 ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด Sample ํด๋ž˜์Šค์—์„œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ Checked Exception์ด๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๊ฐ•์ œํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€๊ฒฝํ•ด์•ผ ์ •์ƒ์ ์œผ๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค.

 

class FoolException extends Exception {
}

public class Sample {
    public void sayNick(String nick) {
        try {
            if("fool".equals(nick)) {
                throw new FoolException();
            }
            System.out.println("๋‹น์‹ ์˜ ๋ณ„๋ช…์€ "+nick+" ์ž…๋‹ˆ๋‹ค.");
        }catch(FoolException e) {
            System.err.println("FoolException์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.");
        }
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        sample.sayNick("fool");
        sample.sayNick("genious");
    }
}

 

์œ„์˜ ์ฝ”๋“œ์—์„œ Exception์„ ์–ด๋””์„œ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  

์–ด๋””์„œ ์ฒ˜๋ฆฌํ• ์ง€์— ๋”ฐ๋ผ ๋กœ์ง ์ˆ˜ํ–‰์ด ์™„์ „ํžˆ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋จผ์ € ํ˜„ ์ƒํƒœ์ฒ˜๋Ÿผ sayNick ๋ฉ”์„œ๋“œ์—์„œ Exception์„ ์ฒ˜๋ฆฌํ•  ๊ฒฝ์šฐ

sample.sayNick("fool");
sample.sayNick("genious");

๋‹ค์Œ์˜ ๋‘ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋‘ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ main ๋ฉ”์„œ๋“œ์—์„œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ ๊ฒฝ์šฐ์—๋Š”

๋‘๋ฒˆ ์งธ ๋ฌธ์žฅ์ธ sample.sayNick("genious");๊ฐ€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์™œ๋ƒํ•˜๋ฉด ์ด๋ฏธ ์ฒซ๋ฒˆ ์งธ ๋ฌธ์žฅ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ catch ๋ฌธ์œผ๋กœ ๋น ์ ธ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

try {
    sample.sayNick("fool");
    sample.sayNick("genious");  // ์ด ๋ฌธ์žฅ์€ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.
}catch(FoolException e) {
    System.err.println("FoolException์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.");
}

 

class FoolException extends Exception {
}

public class Sample {
    public void sayNick(String nick) throws FoolException { //Exception ์ฒ˜๋ฆฌ๋ฅผ ์œ„๋กœ ๋ฏธ๋ฃจ๊ธฐ
        if("fool".equals(nick)) {
            throw new FoolException();
        }
        System.out.println("๋‹น์‹ ์˜ ๋ณ„๋ช…์€ "+nick+" ์ž…๋‹ˆ๋‹ค.");
    }

    public static void main(String[] args) {
        Sample sample = new Sample();
        try {
            sample.sayNick("fool");
            sample.sayNick("genious");
        } catch (FoolException e) {
            System.err.println("FoolException์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.");
        }
    }
}

 

 ์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์‹œ Exception์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์œ„์น˜๋Š” ๋Œ€๋‹จํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์˜ ์ˆ˜ํ–‰์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ๋„ ํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ์™€๋„ ๋ฐ€์ ‘ํ•œ ๊ด€๊ณ„๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 


๐Ÿ“ŒํŠธ๋žœ์žญ์…˜

ํŠธ๋žœ์žญ์…˜๊ณผ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋Š” ๋งค์šฐ ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

์‡ผํ•‘๋ชฐ์˜ "์ƒํ’ˆ๋ฐœ์†ก"์ด๋ผ๋Š” ํŠธ๋žœ์žญ์…˜์„ ๊ฐ€์ •ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

"์ƒํ’ˆ๋ฐœ์†ก" ์ด๋ผ๋Š” ํŠธ๋žœ์žญ์…˜์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ž‘์—…๋“ค์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ํฌ์žฅ
  • ์˜์ˆ˜์ฆ ๋ฐœํ–‰
  • ๋ฐœ์†ก

์‡ผํ•‘๋ชฐ์˜ ์šด์˜์ž๋Š” ์ด 3๊ฐ€์ง€ ์ผ๋“ค ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด 3๊ฐ€์ง€ ๋ชจ๋‘ ์ทจ์†Œํ•˜๊ณ 

"์ƒํ’ˆ๋ฐœ์†ก" ์ „์˜ ์ƒํƒœ๋กœ ๋Œ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

์ƒํ’ˆ๋ฐœ์†ก() {
    ํฌ์žฅ();
    ์˜์ˆ˜์ฆ๋ฐœํ–‰();
    ๋ฐœ์†ก();
}

ํฌ์žฅ() {
   ...
}

์˜์ˆ˜์ฆ๋ฐœํ–‰() {
   ...
}

๋ฐœ์†ก() {
   ...
}

 

 

๋‹ค์Œ๊ณผ ๊ฐ™์ด ํฌ์žฅ, ์˜์ˆ˜์ฆ๋ฐœํ–‰, ๋ฐœ์†ก ๋ฉ”์„œ๋“œ์—์„œ๋Š” ์˜ˆ์™ธ๋ฅผ throwํ•˜๊ณ 

์ƒํ’ˆ๋ฐœ์†ก ๋ฉ”์„œ๋“œ์—์„œ throw๋œ ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋ชจ๋‘ ์ทจ์†Œํ•˜๋Š” ๊ฒƒ์ด ์™„๋ฒฝํ•œ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

์ƒํ’ˆ๋ฐœ์†ก() {
    try {
        ํฌ์žฅ();
        ์˜์ˆ˜์ฆ๋ฐœํ–‰();
        ๋ฐœ์†ก();
    }catch(์˜ˆ์™ธ) {
        ๋ชจ๋‘์ทจ์†Œ();  // ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด ๋ชจ๋‘ ์ทจ์†Œํ•œ๋‹ค.
    }
}

ํฌ์žฅ() throws ์˜ˆ์™ธ {
   ...
}

์˜์ˆ˜์ฆ๋ฐœํ–‰() throws ์˜ˆ์™ธ {
   ...
}

๋ฐœ์†ก() throws ์˜ˆ์™ธ {
   ...
}

 

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์œ„์™€ ๊ฐ™์ด ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•œ๋‹ค๋ฉด

๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์ด ํฌ๊ฒŒ ํ”๋“ค๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ƒํ’ˆ๋ฐœ์†ก() {
    ํฌ์žฅ();
    ์˜์ˆ˜์ฆ๋ฐœํ–‰();
    ๋ฐœ์†ก();
}

ํฌ์žฅ(){
    try {
       ...
    }catch(์˜ˆ์™ธ) {
       ํฌ์žฅ์ทจ์†Œ();
    }
}

์˜์ˆ˜์ฆ๋ฐœํ–‰() {
    try {
       ...
    }catch(์˜ˆ์™ธ) {
       ์˜์ˆ˜์ฆ๋ฐœํ–‰์ทจ์†Œ();
    }
}

๋ฐœ์†ก() {
    try {
       ...
    }catch(์˜ˆ์™ธ) {
       ๋ฐœ์†ก์ทจ์†Œ();
    }
}

 

 

 

์ฐธ๊ณ :

https://wikidocs.net/229