๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์‹œ๋„/๊ตญ๋น„์ง€์›

[D+24] ์˜ˆ์™ธ์ฒ˜๋ฆฌ

by ๐Ÿ‡๋ฐ•๋ด‰๋ด‰๐Ÿ‡ 2022. 10. 25.

 

 

๊ตญ๋น„์ง€์› D+24

-  ์˜ˆ์™ธ์ฒ˜๋ฆฌ -

 


 

์˜ˆ์™ธ์ฒ˜๋ฆฌ

์˜ˆ์™ธ (Exception)

- ์‚ฌ์šฉ์ž ์‹ค์ˆ˜, ์‹œ์Šคํ…œ์˜ ๋ฌธ์ œ๋กœ ์ธํ•ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋Œ€์‘ํ•˜์ง€ ๋ชปํ•˜๋Š” ๋น„์ •์ƒ์ ์ธ ์ƒํ™ฉ (abnormal condition)

- ์ฝ”๋“œ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹˜.

- ์‹คํ–‰์‹œ๊ฐ„(Run-Time)์— ๋ฐœ์ƒํ•˜๋Š” ๋น„์ •์ƒ์  ์ƒํ™ฉ

- ๋น„์ •์ƒ์  ์ƒํ™ฉ์€ ๋Œ€๋ถ€๋ถ„ ์–ด๋–ค๊ฒŒ ์ •์ƒ์ ์ธ์ง€ ํŒ๋‹จ ๋ถˆ๊ฐ€๋Šฅ

- ํŒ๋‹จ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— JVM ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ€๊ธ‰์  ์ข…๋ฃŒ 

 

์˜ˆ์™ธ์—๋Š” ์˜ˆ์ธก๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ์™€ ์˜ˆ์ธก๋ถˆ๊ฐ€๋Šฅํ•œ ์˜ˆ์ธก์ด ์žˆ๋‹ค.

์ด๋•Œ ์˜ˆ์ธก๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋Œ€์‘์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋‚˜๊ฐˆ์ˆ˜ ์žˆ์ง€๋งŒ, ์˜ˆ์ธก์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋Œ€์‘ํ•  ์ˆ˜ ์—†๋Š” ์˜ˆ์™ธ๋„ ์กด์žฌํ•œ๋‹ค.

์ด๋•Œ ์˜ˆ์ธก๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๋Š” ๊ฒฐ๋ก ์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐํ•จ์ด ์—†๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฐ˜๋Œ€๋กœ ์˜ˆ์ธก๋ถˆ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ–ˆ์œผ๋‹ˆ ๊ฒฐํ•จ์ด ์กด์žฌํ•œ๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์˜ˆ์™ธ์ฒ˜๋ฆฌ

์šฐ๋ฆฌ๊ฐ€ ์•Œ์•„์•ผํ•  ๊ฒƒ์€ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋Š” ๋น„์ •์ƒ์ ์ธ์ƒํƒœ๋ฅผ ์ •์ƒ์ ์ธ ์ƒํƒœ๋กœ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด ์•„๋‹ˆ๋ผ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ฃผ๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด๋‹ค.

 

์—ฌ๊ธฐ ๋‘๊ฐœ์˜ ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์•„ ๋‚˜๋ˆˆ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ๋‚ด๊ฐ€ ๋‘๋ฒˆ์งธ ๊ฐ’์— 0์„ ์ž…๋ ฅํ–ˆ์„๊ฒฝ์šฐ ์ปดํ“จํ„ฐ๋Š” ๋‚˜๋ˆ„๊ธฐ๋ฅผ ๊ฐ’์ด ๋‚˜์˜ฌ๋•Œ ๊นŒ์ง€ ๋นผ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— 0์„ ๋„ฃ์œผ๋ฉด ๋ฌดํ•œ ๋ฃจํ”„๋ฅผ ๋Œ์•„ ์˜ˆ์™ธ๋กœ์ธํ•œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ๋˜๋ฉด์„œ ์ข…๋ฃŒํ•ด๋ฒ„๋ฆฐ๋‹ค.

 

์ฆ‰, ์ฝ”๋“œ์—์„œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋˜์—ˆ์„ ๊ฒฝ์šฐ ์ปดํ“จํ„ฐ๋Š” ํ•ด๋‹น ํ”„๋กœ๊ทธ๋žจ์ด ๋ฌด๊ฒฐ์„ฑ์„ ์žƒ์—ˆ๋‹ค๊ณ  ํŒ๋‹จํ•ด ๋ฐ‘์— ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ข…๋ฃŒํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์กฐ๊ฑด๋ฌธ์„ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํ†ตํ•ด์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์†Œ์Šค์ฝ”๋“œ์˜ ๋ณต์žก๋„๋ฅผ ๋Š˜๋ฆด์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ์ปดํŒŒ์ผํƒ€์ž„์— ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋Ÿฐํƒ€์ž„๊ฐ™์€ ๊ฒฝ์šฐ์—” ์šฐ๋ฆฌ๋Š” ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค. ์ด๋Ÿด๋•Œ ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ด๋– ํ•œ ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š”์ง€ ์•Œ๋ ค์ค˜์•ผํ•˜๋Š”๋ฐ ๊ทธ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ๋ฌธ์ด ๋ฐ”๋กœ try - catch ์ด๋‹ค.

 

try - catch

try
{
	// ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋ ๋งŒํ•œ ์ฝ”๋“œ
}

catch( ์˜ˆ์™ธ1 e )	// ์˜ˆ์™ธ1์ด ๋ฐœ์ƒ๋˜์—ˆ๋‹ค๋ฉด
{
	// ์ด๋ ‡๊ฒŒ ํ•ด๋ผ
    return;
}

catch( ์˜ˆ์™ธ2 e )	// ์˜ˆ์™ธ2์ด ๋ฐœ์ƒ๋˜์—ˆ๋‹ค๋ฉด
{
	// ์ด๋ ‡๊ฒŒ ํ•ด๋ผ
    return;
}

try์™€ catch๋Š” ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

 

try

์˜ˆ์™ธ๋ฐœ์ƒ ์˜ˆ์ƒ ๋ธ”๋Ÿญ

- ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

- JVM์—๊ฒŒ "์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฒ˜๋ฆฌํ•  ์ค€๋น„์ข€ ํ•ด์ฃผ์„ธ์š”"๋ผ๊ณ  ๋ถ€ํƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

- JVM์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•˜๊ธฐ ์ „์— ์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ค€๋‹ค. 

 

catch

ํŠน์ •์˜ˆ์™ธ๋ฅผ ์ฒ˜๋ฆฌ

- ํŠน์ • ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์ž๋งˆ์ž ๋ฐ”๋กœ catch๋กœ ์ด๋™ํ•˜์—ฌ ์˜ˆ์™ธ์— ๋Œ€ํ•œ ๊ฒƒ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ข…๋ฃŒํ•œ๋‹ค.

- catch์— ์ ‘๊ทผํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค๋Š” ๋”์ด์ƒ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

- ์˜ˆ์™ธ์˜ ์ข…๋ฃŒ์— ๋”ฐ๋ผ ์ดํ›„์˜ ์ฝ”๋“œ๋ฅผ ๋Œ๋ ค์ฃผ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์œผ๋ฉฐ, ์ฝ”๋“œ๋ฅผ ๋Œ๋ฆฌ์ง€ ์•Š๊ณ  ๋ฐ”๋กœ ์ข…๋ฃŒ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

- ์—ฌ๋Ÿฌ์˜ˆ์™ธ์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ catch๋ฅผ ์ž…๋ ฅํ•ด๋„ ๋œ๋‹ค.

 

finally

try - catch๋ฅผ ์‚ฌ์šฉํ• ๋•Œ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋˜ ๋ฌด์กฐ๊ฑด ์‹คํ–‰์‹œ์ผœ์ค€๋‹ค.

 

์˜ˆ์™ธ์ฒ˜๋ฆฌ์‹œ ์ฃผ์˜์‚ฌํ•ญ

์˜ˆ์™ธ๋Š” ํฌ๊ฒŒ Error์™€ Exception ๋‘๊ฐ€์ง€๋กœ ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ ์ด๋•Œ Error๋Š” unchecked๋กœ ์šฐ๋ฆฌ๊ฐ€ ํ™•์ธํ•ด๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์•ˆ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๋Š” Error๋Š” ์ƒ๋žตํ•˜๊ณ  Exception์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•˜๋ฉด ๋œ๋‹ค.

Exception๋‚ด์—์„œ๋„ ์ฒ˜๋ฆฌ๋ฅผ ๋ฐ˜๋“œ์‹œํ•ด์•ผ๋งŒ ํ•˜๋Š” ์˜ˆ์™ธ๊ฐ€ ์žˆ๊ณ  ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์˜ˆ์™ธ๊ฐ€ ์žˆ๋Š”๋ฐ ์šฐ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ์„œ ์ œ์ผ ์ค‘์š”ํ•˜๊ฒŒ ๋ด์•ผํ•  ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ์˜ˆ์™ธ๋“ค์€ Exception์ด๋ผ๋Š” ํด๋ž˜์Šค์— ์†ํ•˜๋ฉฐ, ๊ฐ€์žฅ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค๋Š” Throwable์ด๋ผ๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฆ‰, ๋‚ด๊ฐ€ ๋งŒ์•ฝ catch๋ฅผ ํ†ตํ•ด IOException์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌํ•˜๋ คํ• ๋•Œ IOException์ด๋ผ๊ณ  ์ž‘์„ฑํ•˜์ง€์•Š๊ณ  Throwable์ด๋‚˜ Exception์ด๋ผ๊ณ  ์ ์–ด๋„ ๋ฌธ์ œ๊ฐ€ ์ž˜ํ•ด๊ฒฐ๋œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

try
{
	//์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋ ๋งŒํ•œ ์ฝ”๋“œ
}

catch(IOException e){ //IOException์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด

}

catch(Exception e){	//Exception์ด ๋ฐœ์ƒํ–ˆ๋‹ค๋ฉด

}

๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์šฐ๋ฆฌ๊ฐ€ Exception์ด์•„๋‹Œ IOException๊ณผ ๊ฐ™์€ ํŠน์ • ์—๋Ÿฌ์— ๊ด€๋ จ๋œ catch๋ฌธ์„ ์ž‘์„ฑํ•˜๋Š” ์ด์œ ๋Š” ์„ฑ๋Šฅ์ด๋‚˜ ์†๋„ ๋ฌธ์ œ๋กœ์ธํ•ด ๊ฐ€๊ธ‰์  ์ ์ •ํ•œ ๋ฒ”์œ„๋‚ด์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ์—ฌ๋Ÿฌ ์˜ˆ์™ธ์—๋Œ€ํ•œ catch๋ฌธ์„ ์ž‘์„ฑํ•  ๋•Œ์—๋„ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  ์ƒ์œ„ํด๋ž˜์Šค๋“ค์„ ์•„๋ž˜์— ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ด๊ณ  ๋ฐ๋“œ์ฝ”๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€์•Š๋Š”๋‹ค. 

 

throws

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.BufferedWriter;
import java.io.IOException;

public class Main {

	public static void main(String[] args) {
		
		Path file = Paths.get("C:\\Users\\101-15\\Documents\\test.txt");
		
		BufferedWriter writer = null;	
		
		try {
			writer = Files.newBufferedWriter(file);
			writer.write('A');
			writer.write('D');
			
			if(writer != null)
				writer.close();
		}
		
		catch (IOException e)
		{
			e.printStackTrace();
		}
		
	}

}

์šฐ๋ฆฌ๊ฐ€ ๊ธฐ์กด์— ํ•™์Šตํ•œ ๊ฒƒ์€ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ๋ ๊ฒƒ ๊ฐ™์€ ๋ถ€๋ถ„์„ try์•ˆ์— ๋†“๊ณ  ์˜ˆ์™ธ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋ฅผ catch๋ฅผ ํ†ตํ•ด์„œ ์ฒ˜๋ฆฌํ•ด์ค€๋‹ค๊ณ  ํ•™์Šตํ•˜์˜€๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์—ฌํƒœ ๋ฐฐ์šด๊ฒƒ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์œ„์˜ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.io.BufferedWriter;
import java.io.IOException;

public class Main {
	
	public static void func2() throws IOException, ArrayIndexOutOfBoundsException
	{
		Path file = Paths.get("C:\\Users\\101-15\\Documents\\test.txt");
		
		BufferedWriter writer = null;	
		
		writer = Files.newBufferedWriter(file);
		writer.write('A');
		writer.write('D');
		writer.close();
		
		int[] ar = {11, 22};
		System.out.println(ar[2]);
		
	}
	
	public static void func1() throws IOException, ArrayIndexOutOfBoundsException
	{
		func2();
	}

	public static void main(String[] args) {
		
		try {
		func1();
		}
		catch(IOException e)
		{
			e.printStackTrace();
			System.out.println("IOEception");
			
		}
		catch(ArrayIndexOutOfBoundsException e)
		{
			e.printStackTrace();
			System.out.println("index over");
		}
	}

}

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ main์˜ func1์˜ func2์— ์žˆ๋Š” ์—๋Ÿฌ๋ฅผ main์—์„œ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ณ  ์‹ถ์„๋•Œ์—๋Š” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ main์— ์žˆ๋Š” func1์„ ํ†ตํ•ด์„œ try-catch๋ฅผ ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ ํ•จ์ˆ˜๋“ค์ด ์ข…์†์ ์ธ ๊ด€๊ณ„๋ฅผ ๊ฐ€์ ธ ์ผ๋ถ€ ์ฑ…์ž„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜์—๋‹ค๊ฐ€ throws ์˜ˆ์™ธ๋ช… ์ž‘์„ฑํ•ด์„œ ํ•ด๋‹นํ•จ์ˆ˜ ์œ„์—๋‹ค๊ฐ€ ๋ฐœ์ƒํ•œ ์˜ˆ์™ธ๋ฅผ ์œ„์—๋‹ค๊ฐ€ ๋˜์ ธ์ค„ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ์ผ์ข…์˜ ๊ฐ€์ด๋“œ๋ผ์ธ์˜ ๊ธฐ๋Šฅ์„ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€