λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’»/JAVA

[Java] 14일차 : μ˜ˆμ™Έ(Exception)처리

by λ”°κΆˆ 2024. 3. 5.

 

μ—λŸ¬μ˜ μ’…λ₯˜

 

  1. 컴파일 μ—λŸ¬ (compile time error)
    컴파일 ν•  λ•Œ λ°œμƒλ˜λŠ” μ—λŸ¬
    잘λͺ»λœ 문법을 μ‚¬μš©ν•˜κ±°λ‚˜ λ³€μˆ˜λ₯Ό μ •μ˜ν•˜μ§€ μ•Šμ€ μƒνƒœμ—μ„œ μ‚¬μš©ν•˜λŠ” λ“± 컴파일 λ‹¨κ³„μ—μ„œ λ°œμƒλ˜λŠ” 문법적 μ—λŸ¬ 
  2. λŸ°νƒ€μž„ μ—λŸ¬ (runtime error)
    ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ ν•  λ•Œ λ°œμƒν•˜λŠ” μ—λŸ¬λ‘œ μ—λŸ¬(error)와 μ˜ˆμ™Έ(exception)κ°€ μžˆλ‹€
    - error(μ—λŸ¬) : μ‹œμŠ€ν…œ μ΄μƒμœΌλ‘œ λ°œμƒλ˜λŠ” μ—λŸ¬. μ‹œμŠ€ν…œ 레벨의 μ‹¬κ°ν•œ 였λ₯˜μ΄λ―€λ‘œ μ‹œμŠ€ν…œμ— λ³€ν™œλ₯΄ μ£Όμ–΄ 문제λ₯Ό μ²˜λ¦¬ν•˜λŠ” κ²½μš°κ°€ 일반적. ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μ—λŸ¬κ°€ λ°œμƒν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œ
    -exception(μ˜ˆμ™Έ) : ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 λ°œμƒλ˜λŠ” 비정상적인 상황을 의미. ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œ
  3. 논리적 μ—λŸ¬ : κ°œλ°œμžκ°€ λ¬Έμ œλΆ„μ„μ„ 잘λͺ»ν•˜κ±°λ‚˜ μ‹€μˆ˜μ— μ˜ν•˜μ—¬ μ—‰λš±ν•œ κ²°κ³Όλ₯Ό κ°€μ Έμ˜€λŠ” μ—λŸ¬

 

 

에외(Exception)λž€?
ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 λ°œμƒλ˜λŠ” 비정상적인 상황을 의미
μ‚¬μš©μžμ˜ 잘λͺ»λœ μ‘°μž‘μ΄λ‚˜ 개발자의 잘λͺ»λœ μ½”λ”©μœΌλ‘œ 인해 λ°œμƒν•˜λŠ” λŸ°νƒ€μž„ 였λ₯˜
0으둜 λ‚˜λˆ„κ±°λ‚˜, λ°°μ—΄μ˜ 첨자λ₯Ό λ²—μ–΄λ‚˜λŠ” 경우 λ˜λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” νŒŒμΌμ„ openν•˜μ—¬ 읽어 λ“€μ΄λŠ” 것 λ“±
ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œ

μ˜ˆμ™Έ 처리(Exception Handling)λž€?
ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μ‹œ λ°œμƒλ  수 μžˆλŠ” μ˜ˆμ™Έμ— λŒ€λΉ„ν•˜κΈ° μœ„ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 것
μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν†΅ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ˜ 비정상 μ’…λ£Œλ₯Ό 막고 정상적인 μ‹€ν–‰ μƒνƒœλ₯Ό μœ μ§€ν•œλ‹€.


 

 

μ˜ˆμ™Έ(Exception)의 μ’…λ₯˜

 

● checked exception

   μ»΄νŒŒμΌ ν•  λ•Œ μ»΄νŒŒμΌλŸ¬μ— μ˜ν•΄ μ²΄ν¬λ˜λŠ” μ˜ˆμ™Έ. ν”„λ‘œκ·Έλž¨ μž‘μ„±μ‹œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό λͺ…μ‹œμ μœΌλ‘œ ν•˜μ§€ μ•ŠμœΌλ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒ

 

● unchecked exception 

   μ»΄νŒŒμΌ ν•  λ•Œ μ²΄ν¬λ˜μ§€ μ•ŠμœΌλ©°, λŸ°νƒ€μž„ μ‹œ λ°œμƒλ˜λŠ” μ˜ˆμ™Έ 

 

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

 

 

 

μ˜ˆμ™Έ(Exception) 클래슀 

 

● java.lang.Throwable클래슀

Throwable ν΄λž˜μŠ€λŠ” μžλ°”μ˜ λͺ¨λ“  μ—λŸ¬μ™€ μ˜ˆμ™Έμ˜ 슈퍼 클래슀

java.lang.Throwable 클래슀

 

● java.lang.Exception 클래슀

 Throwable 클래슀λ₯Ό 상속 받은 ν•˜μœ„ 클래슀

 Exception ν΄λž˜μŠ€λ‚˜ Exception 클래슀λ₯Ό 상속 받은 ν•˜μœ„ ν΄λž˜μŠ€λŠ” RuntimeException 클래슀λ₯Ό μ œμ™Έν•˜κ³  λͺ¨λ‘ 컴파일 ν•    λ•Œ μ˜ˆμ™Έλ₯Ό μ²΄ν¬ν•˜λŠ” checked exception 이닀. ν”„λ‘œκ·Έλž¨ μž‘μ„± μ‹œ λͺ…μ‹œμ μœΌλ‘œ μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•˜μ§€ μ•ŠμœΌλ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒ

 Exception 클래슀λ₯Ό 상속 받은 μ£Όμš” checked exception 클래슀 

java.lang.Exception 클래슀

 

● java.lang.RuntimeException 클래슀

  Exception 클래슀λ₯Ό 상속 받은 ν•˜μœ„ 클래슀. ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 λ°œμƒλ˜λŠ” λŸ°νƒ€μž„ μ˜ˆμ™Έ. RuntimeException ν΄λž˜μŠ€λ‚˜ RuntimeException  클래슀λ₯Ό 상속받은 unchecked exception.

java.lang.RuntimeException 클래슀

 

●java.lang.Error 클래슀

 Throwable 클래슀λ₯Ό 상속 받은 ν•˜μœ„ 클래슀. μ‹¬κ°ν•œ μ˜ˆμ™Έμ˜ ν˜•νƒœλ‘œ 볡원할 수 μ—†λŠ” ν˜•νƒœμ˜ μ—λŸ¬. Error ν΄λž˜μŠ€λ‚˜ Error 클래슀λ₯Ό 상속 받은 ν΄λž˜μŠ€λŠ” unchecked error이닀 

java.lang.Error 클래슀

 

 

β–Ά μ˜ˆμ™Έ 처리 μž₯점

  1. μ˜ˆμ™Έ λ°œμƒμ‹œ 비정상적인 ν”„λ‘œκ·Έλž¨ μ’…λ£Œλ₯Ό 막고 ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ μƒνƒœλ₯Ό μœ μ§€
  2. ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ μ½”λ“œμ™€ μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•˜λŠ” μ½”λ“œλ₯Ό λΆ„λ₯˜ν•  수 μžˆλ‹€.
  3. λ©”μ†Œλ“œμ˜ 콜 μŠ€νƒ(Call Stack)에 μ—λŸ¬λ₯Ό μ°¨λ‘€λŒ€λ‘œ 보낼 수 μžˆλ‹€.
  4. μ˜ˆμ™Έ νƒ€μž…μ„ μ’…λ₯˜λ³„λ‘œ λΆ„λ₯˜ν•  수 μžˆλ‹€.

 


 

try ~ catch 

try 문으둜 μ˜μ—­μ΄ μ§€μ •λœ λ¬Έμ—μ„œ μ˜ˆμ™Έ 상황이 λ°œμƒν•˜λ©΄, ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” catchλ¬Έ μͺ½μœΌλ‘œ λ„˜κ²¨ 였λ₯˜μ— κ΄€ν•œ μ˜ˆμ™Έ 상황을 μ²˜λ¦¬ν•œλ‹€.

ν˜•μ‹

β–Άtry 블둝

μ˜ˆμ™Έλ₯Ό κ°μ‹œν•˜κ³ μž ν•˜λŠ” λ¬Έμž₯듀을 try블둝 내에 기술

μ˜ˆμ™Έκ°€ λ°œμƒν•  경우 try 블둝 λ‚΄μ˜ λ¬Έμž₯ 싀행을 μ€‘μ§€ν•˜κ³  ν•΄λ‹Ή μ˜ˆμ™Έμ˜  catch λΈ”λ‘μ˜ λ‚΄μš©μ„ μ‹€ν–‰ν•œλ‹€.

 

β–Άcatch 블둝

μ˜ˆμ™Έκ°€ λ°œμƒν•  경우 μ²˜λ¦¬ν•  λ¬Έμž₯을 기술

catch문은 Throwable 클래슀λ₯Ό μƒμ†λ°›λŠ” μ˜ˆμ™Έ 클래슀 νƒ€μž…μ„ κ°€μ§„ ν•œκ°œμ˜ 인자λ₯Ό κ°–λŠ”λ‹€. catch 블둝은 μ—¬λŸ¬ κ°œκ°€ 올 수 μžˆλ‹€. μ˜ˆμ™Έκ°€ try λΈ”λ‘μ—μ„œ λ°œμƒν•˜λ©΄ catch블둝을 순차적으둜 μ°Ύμ•„ λ‚΄λ €κ°€λ©΄μ„œ ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” μ˜ˆμ™Έν΄λž˜μŠ€μ˜ 인자λ₯Ό κ°€μ§„ catch λΈ”λ‘μ˜ λ¬Έμž₯을 μˆ˜ν–‰ν•œλ‹€. μ—¬λŸ¬ 개의 catch문이 μ‘΄μž¬ν•  경우 순차적으둜 μ˜ˆμ™Έλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μƒμœ„ 클래슀λ₯Ό λ‚˜μ€‘μ— 두어야 ν•œλ‹€. 

 

package ch09.unit01;

import java.util.Scanner;

/*
 - μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ” 경우
 	1) 블둝 λͺ¨λ‘ μ‹€ν–‰ 
 	3) 블둝 μ‹€ν–‰ - 정상 μ’…λ£Œ 
 - μ˜ˆμ™Έκ°€ λ°œμƒν•œ 경우
 	1) 블둝 μ‹€ν–‰ 도쀑 μ˜ˆμ™Έ λ°œμƒ - 1)번 블둝 싀행을 쀑지 
 	2) 블둝 μ‹€ν–‰ (μ˜ˆμ™Έκ°€ λ°œμƒν•œ 경우만 μ‹€ν–‰)
 	3) 블둝 μ‹€ν–‰ - 정상 μ’…λ£Œ 
 
 */


public class Ex02 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a,b,c ;
		
		try {
			// 1) μ˜ˆμ™Έκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλŠ” μ½”λ“œ 기술 
			System.out.println("λ‘μ •μˆ˜?");
			a = sc.nextInt();
			b = sc.nextInt();
			
			c = a / b;
			
			System.out.println(a + "/" + b + "=" + c);
		} catch (Exception e) {
			// Exception : λͺ¨λ“  μ˜ˆμ™Έλ₯Ό catch ν•  수 μžˆμ§€λ§Œ μ˜ˆμ™Έ μƒν™œλ³„λ‘œ μ˜ˆμ™Έλ₯Ό 뢄리할 수 μ—†λ‹€
			// 2) μ˜ˆμ™Έκ°€ λ°œμƒν•  λ•Œ μ‹€ν–‰ν•  μ½”λ“œ μž‘μ„± 
			System.out.println("ν”„λ‘œκ·Έλž¨ 싀행쀑 μ˜ˆμ™Έκ°€ λ°œμƒ");
		}
		
		// 3) 
		System.out.println("end...");
		
		sc.close();
	}

}

 

 

package ch09.unit01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ex03 {

	public static void main(String[] args) {
		// 버퍼λ₯Ό μ΄μš©ν•˜μ—¬ 문자(μ—΄)을 μž…λ ₯ λ°›μŒ. μž…λ ₯ 속도 ν–₯상
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		// BufferedReader : λ¬Έμžμ—΄μ„ ν•œλ²ˆμ— λ°›μ„μˆ˜μžˆμŒ 
		// InputStreamReader:λ°”μ΄νŠΈ μŠ€νŠΈλ¦Όμ„ 문자둜 고쳐쀌
		
		String s;
		int a,b,c;
		
		try {
			System.out.print("첫번째 수?");
			s = br.readLine();
			a = Integer.parseInt(s); // 숫자둜 λ°”κΏ”μ€Œ 
			
			System.out.print("λ‘λ²ˆμ§Έ 수?");
			b = Integer.parseInt(br.readLine()); 
			
			c = a/b;
			System.out.printf("%d / %d = %d\n",a,b,c);
			
		} catch (IOException e) { // Exception
			// IOException : 상황별 μ˜ˆμ™Έ 
			//: μž…μΆœλ ₯에 λ¬Έμ œκ°€ λ°œμƒν• λ•Œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έ(checked exception)
			//: checked exception은 λ©”μ†Œλ“œλ₯Ό λ§Œλ“€λ•Œ throws ν•œ μ˜ˆμ™Έ
			// :checked exception은 μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•˜μ§€ μ•ŠμœΌλ©΄ μ»΄νŒŒμΌμ‹œ μ—λŸ¬ λ°œμƒ 
			e.printStackTrace();
		}
		
		// 0으둜 λ‚˜λˆ„κ±°λ‚˜ λ¬Έμžμ—΄μ„ μž…λ ₯ ν•œ 경우 비정상 μ’…λ£Œ λ˜μ–΄ μ•„λž˜ λ©”μ‹œμ§€λŠ” 좜λ ₯ μ•ˆλœλ‹€.
		System.out.println("end...");
	}

}

 

 

 

package ch09.unit01;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ex04 {

	public static void main(String[] args) {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int a, b, c;

		try {
			System.out.print("첫번째 수?");
			a = Integer.parseInt(br.readLine());

			System.out.print("λ‘λ²ˆμ§Έ 수?");
			b = Integer.parseInt(br.readLine());

			c = a / b;
			System.out.printf("%d / %d = %d\n", a, b, c);

			// μ˜ˆμ™Έλ₯Ό μƒν™©λ³„λ‘œ 뢄리
		} catch (IOException e) { // checked μ˜ˆμ™Έ λ°˜λ“œμ‹œ catch 해야함
			e.printStackTrace();
		} catch (NumberFormatException e) {
			// unchecked μ˜ˆμ™Έ
			// λ¬Έμžμ—΄μ„ 숫자둜 λ³€ν™˜ν•˜μ§€ λͺ»ν•˜λŠ” 경우 λ“±μ—μ„œ λ°œμƒ
			// λ°˜λ“œμ‹œ catch ν•  ν•„μš”λŠ” μ—†μ§€λ§Œ catch ν•˜μ§€ μ•Šμ€ 경우
			// μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ 비정상적인 μ’…λ£Œκ°€ 됨

			System.out.println("숫자만 μž…λ ₯ κ°€λŠ₯ν•©λ‹ˆλ‹€.");
			// System.out.println(e.getMessage());//κ°„λ‹¨ν•œ λ©”μ‹œμ§€ 좜λ ₯, μ•ˆλ‚˜μ˜¬λ–„λ„ 있음
			// System.out.println(e.toString());// μ˜ˆμ™Έ μ’…λ₯˜ 및 λ©”μ‹œμ§€ 좜λ ₯
			// e.printStackTrace(); // κ°€μž₯ μžμ„Έν•˜κ²Œ λ‚˜μ˜΄
		} catch (ArithmeticException e) {
			// unchecked μ˜ˆμ™Έ
			// 숫자λ₯Ό 0으둜 λ‚˜λˆ„λŠ”λ“± 연산이 λΆˆκ°€λŠ₯ν•œ 경우
			System.out.println("0으둜 λ‚˜λˆŒμˆ˜ μ—†μŠ΅λ‹ˆλ‹€");

		} catch (Exception e) {
			// Exception : λͺ¨λ“  μ˜ˆμ™Έλ₯Ό catch ν•  수 μžˆλ‹€.
			// μ—¬λŸ¬ μ˜ˆμ™Έλ₯Ό catchν•  경우 Exception은 λ‹€λ₯Έ μ˜ˆμ™Έμ˜
			// μƒμœ„ ν΄λž˜μŠ€μ΄λ―€λ‘œ κ°€μž₯ λ§ˆμ§€λ§‰μ— μœ„μΉ˜ν•΄μ•Όν•¨
			e.printStackTrace();
		}

		System.out.println("end...");
	}

}

 

 

finally 

런 νƒ€μž„μ‹œ μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관 없이 λ°˜λ“œμ‹œ μ‹€ν–‰ ν•΄μ•Ό ν•  μ½”λ“œλ₯Ό finally 블둝에 κΈ°μˆ ν•œλ‹€. μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ©΄ ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” catch 블둝을 μ‹€ν–‰ ν•œ ν›„ finally 블둝이 μ‹€ν–‰λ˜κ³ , μ˜ˆμ™Έκ°€ λ°œμƒν•˜μ§€ μ•Šμ•˜μ„ 경우, try λΈ”λ‘μ˜ 싀행이 λλ‚œ 뒀에 finally 블둝이 μ‹€ν–‰λœλ‹€. 

finally 블둝은 μ˜ˆμ™Έκ°€ λ°œμƒν•˜κ±°λ‚˜ λ°œμƒν•˜μ§€ μ•Šμ€ 경우, break,continue,returnκ³Ό 같은 λ¬Έμž₯을 ν†΅ν•΄μ„œ 블둝을 λΉ μ Έλ‚˜κ°ˆ κ²½μš°μ—λ„ μ‹€ν–‰λ˜λ©° 'System,exit(0);' λ¬Έμž₯이 μžˆλŠ” κ²½μš°μ—λ§Œ finallyμ ˆμ„ μˆ˜ν–‰ν•˜μ§€ μ•Šκ³  ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλœλ‹€. 

- catch 블둝이 없이 try ~ finally λΈ”λ‘λ§Œ μ‘΄μž¬ν•  수 μžˆλ‹€. 

- μ˜ˆμ™Έκ°€ μ—†λŠ” 경우 처리 μˆœμ„œ try 블둝 → finally 블둝 μ‹€ν–‰

- μ˜ˆμ™Έκ°€ μžˆλŠ” 경우 처리 μˆœμ„œ  try 블둝 → catch 블둝  →  finally 블둝 μ‹€ν–‰

 

ν˜•μ‹
catch 블둝이 μ—†λŠ” try ~ finally 블둝 μ‚¬μš© ν˜•

 

 

 

β–Άtry ~ catch ~ finally에 μ˜ν•œ μ˜ˆμ™Έ 처리 κ³Όμ •

 

 

 

 

package ch09.unit01;

import java.util.Scanner;

public class Ex06_finally {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String[] ss = new String[3];
		int idx = 0;
		String s;

		try {
			idx = 0;
			System.out.println("λ¬Έμžμ—΄ μž…λ ₯[μ’…λ£Œ:μž…λ ₯ν•˜μ§€ μ•Šκ³  μ—”ν„°]...");
			while ((s = sc.nextLine()).length() != 0) {
				ss[idx++] = s;
				System.out.print("λ¬Έμžμ—΄ μž…λ ₯:");
			}
		} catch (ArrayIndexOutOfBoundsException e) {
			// ArrayIndexOutOfBoundsException
			// : unchecked exception
			// : λ°°μ—΄ 점자λ₯Ό λ²—μ–΄λ‚œ 경우
			idx--;
			System.out.println("μž…λ ₯을 초과 ν–ˆμŠ΅λ‹ˆλ‹€.");
		} finally {
			System.out.println("μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관 없이 μ‹€ν–‰...");
			sc.close();
		}
		System.out.println("\nμž…λ ₯ 받은 λ¬Έμžμ—΄...");
		for (int i = 0; i < idx; i++) {
			System.out.println(ss[i]);
		}
	}

}

 

 

package ch09.unit01;

import java.util.Scanner;

public class Ex07 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a,b,c;
		
		try {
			System.out.print("λ‘μ •μˆ˜?");
			a=sc.nextInt();
			b=sc.nextInt();
			c=a/b;
			System.out.printf("%d / %d = %d\n",a,b,c);
		} finally {
			System.out.println("μ˜ˆμ™Έ μœ λ¬΄μ™€ 상관 없이 μ‹€ν–‰...");
			sc.close();
		}
		System.out.println("end...");
	}

}

 

 

 

package ch09.unit01;

public class Ex08 {

	public static void main(String[] args) {
		//divide(10,5);
		//divide(10,0);
		divide(10,-5);
	}

	public static void divide(int a, int b) {
		try {
			if (b < 0) {
				System.out.println("음수λ₯Ό μž…λ ₯ ν–ˆμŠ΅λ‹ˆλ‹€");
				return;
				//System.out.exit(0);
			}

			int c = a / b;
			System.out.printf("%d/%d =%d\n", a, b, c);
		} catch (ArithmeticException e) {
			System.out.println("0으둜 λ‚˜λˆŒ 수 μ—†μŠ΅λ‹ˆλ‹€.");
		} finally {
			//System.out.exit(0); // 을 λ§Œλ‚ λ–„λ§Œ μ‹€ν–‰ν•˜μ§€ μ•ŠμŒ
			System.out.println("finally 블둝은 return을 λ§Œλ‚˜λ„ μ‹€ν–‰...");
		}
	}

}

 

 

 

 

package ch09.unit01;

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

public class Ex09 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a, b, c;

		try {
			System.out.print("λ‘μˆ˜?");
			a = sc.nextInt();
			b = sc.nextInt();

			c = a / b;
			System.out.printf("%d / %d = %d\n", a, b, c);
		} catch (InputMismatchException e) {
			System.out.println("숫자만 μž…λ ₯ κ°€λŠ₯ν•©λ‹ˆλ‹€.");
		} catch (ArithmeticException e) {
			System.out.println("0으둜 λ‚˜λˆŒμˆ˜ μ—†μŠ΅λ‹ˆλ‹€.");
		} finally {
			// finally 블둝은 λ¦¬μ†ŒμŠ€λ₯Ό λ‹«μ„λ•Œ 많이 μ‚¬μš©ν•œλ‹€.
			sc.close();
		}

	}

}

 

 

 

λͺ¨λ“  μ˜ˆμ™Έ 처리

  • μ˜ˆμ™Έ μ²˜λ¦¬λŠ” μ˜ˆμ™Έκ°€ λ„˜κ²¨μ§„ 객체와 catch문에 μ •μ˜λœ μ˜ˆμ™Έν΄λž˜μŠ€ νƒ€μž…κ³Ό μΌμΉ˜ν•œ catch 블둝을 μ²˜λ¦¬ν•œλ‹€.
  • ν•˜μ§€λ§Œ catchκ°€ νŠΉμ • 객체에 κ΅­ν•œλ˜μ§€ μ•Šκ³  λͺ¨λ“  μ˜ˆμ™Έ 상황을 μž‘μ•„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ catchλ¬Έμ—μ„œ Exception 클래슀 만으둜 λͺ¨λ“  μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•  수 μžˆλ‹€.

ν˜•μ‹

 

 

μ—¬λŸ¬ μ˜ˆμ™Έ 처리 

μžλ°” 7λΆ€ν„°λŠ” ν•˜λ‚˜μ˜ catchλ¬Έμ—μ„œ μ—¬λŸ¬ μ˜ˆμ™Έλ₯Ό '|' μ—°μ‚°μžλ₯Ό μ΄μš©ν•˜μ—¬ 처리 ν•  수 μžˆλ‹€.

ν˜•μ‹

 

 

 

μžλ™ λ¦¬μ†ŒμŠ€ λ‹«κΈ°

μžλ°” 7λΆ€ν„°λŠ” try - with - resourcesλ₯Ό μ‚¬μš©ν•˜λ©΄ μ˜ˆμ™Έ λ°œμƒ 여뢀와 상관없이 μ‚¬μš©ν•˜λ˜ λ¦¬μ†ŒμŠ€ 객체(μž…μΆœλ ₯ 슀트림,μ†ŒμΌ“,채널등) 의 close() λ©”μ†Œλ“œλ₯Ό μžλ™μœΌλ‘œ ν˜ΈμΆœν•΄μ„œ μ•ˆμ „ν•˜κ²Œ λ¦¬μ†ŒμŠ€λ₯Ό λ‹«μ•„ μ€€λ‹€. μžλ°” 7μ—μ„œλŠ” try()μ—μ„œ 객체λ₯Ό 생성해야 ν•˜μ§€λ§Œ μžλ°” 9λΆ€ν„°λŠ” λ‹€μŒκ³Ό 같이 객체 생성문 없이 μƒμ„±λœ 객체λ₯Ό 넣을 수 μžˆλ‹€.

 

 

 

package ch09.unit01;

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

public class Ex10 {

	public static void main(String[] args) {
		int n;
		String s;

		// try ~ with ~ resource : μžλ™μœΌλ‘œ resourceλ₯Ό close
		try (Scanner sc = new Scanner(System.in)) {
			System.out.println("λ‚˜μ΄?");
			n = sc.nextInt();
			s = n >= 19 ? "성인" : "λ―Έμ„±λ…„μž";

			System.out.println(s);

		} catch (InputMismatchException e) {
			System.out.println("숫자만 μž…λ ₯ κ°€λŠ₯ ν•©λ‹ˆλ‹€.");
		}

		System.out.println("end...");

	}

}

 

 

throws에 μ˜ˆμ™Έ λͺ…μ‹œ

λ©”μ†Œλ“œ λ‚΄λΆ€μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•œ 경우 try-catch λΈ”λ‘μœΌλ‘œ μ˜ˆμ™Έ 처리λ₯Ό ν•˜μ§€λ§Œ λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ 곳으둜 throwsλ₯Ό μ‚¬μš©ν•΄μ„œ μ˜ˆμ™Έλ₯Ό λ„˜κΈΈ μˆ˜λ„ μžˆλ‹€. ν˜ΈμΆœν•œ λ©”μ†Œλ“œμ—μ„œ μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•΄μ•Ό ν•˜λŠ” κ²½μš°μ— μ‚¬μš©ν•œλ‹€. 

 

예

 

throw

λ©”μ†Œλ“œμ—μ„œ νŠΉμ • 쑰건에 따라 throwλ₯Ό μ΄μš©ν•˜μ—¬ μ˜ˆμ™Έλ₯Ό λͺ…μ‹œμ μœΌλ‘œ λ°œμƒ μ‹œν‚¨λ‹€. throw에 μ˜ν•΄ λ°œμƒλ˜λŠ” μ˜ˆμ™Έκ°€ RuntimeExceptionκ³Ό RuntimeException의 ν•˜μœ„ ν΄λž˜μŠ€κ°€ μ•„λ‹Œ 경우 λ©”μŠ€λ“œμ˜ μ‹œκ·Έλ‹ˆμ²˜μ—μ„œ throws ν•˜κ±°λ‚˜ try ~catchμ—μ„œ ν•΄λ‹Ή μ˜ˆμ™Έλ₯Ό catch ν•΄μ•Ό ν•œλ‹€ .

package ch09.unit01;

public class Ex12_throws {

	public static void main(String[] args) {
		User12 u = new User12();
		
		try {
			u.setValue(-5);
		} catch (Exception e) {
			//e.printStackTrace();
			System.out.println(e.toString());
		}
		
		System.out.println("end....");
		
	}

}
class User12{
	private int value;

	public int getValue() {
		return value;
	}

	public void setValue(int value) throws Exception {// λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ κ³³μ—μ„œ catch ν•˜λ„λ‘ μ„€μ •
		if(value < 0) {
						
			//κ°•μ œλ‘œ checked exception을 λ°œμƒ
			throw new Exception("0μ΄μƒλ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€");
		
		}
		
		this.value = value;
	}
	
}

 

package ch09.unit01;

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

public class Ex14 {

	public static void main(String[] args) {
		Test14 t = new Test14();
		
		t.input();
		t.input();


	}

}
class Test14{
	private Scanner sc = new Scanner(System.in);
	
	public void input() {
		String name,tel;
		int k, e;
		
		try {
			System.out.print("이름?");
			name = sc.next();
			
			System.out.print("κ΅­μ–΄?");
			k = inputScore();
			
			System.out.print("μ˜μ–΄?");
			e = inputScore();
			
			System.out.print("μ „ν™”λ²ˆν˜Έ?");
			tel = sc.next();
			
			System.out.println(name+":"+k+":"+e+":"+tel);

		} catch (Exception e2) {
			System.out.println(e2.getMessage());
		}
		System.out.println("---------------------");
	}
	
	// μ •μˆ˜λ₯Ό μž…λ ₯ λ°›λŠ” λ©”μ†Œλ“œ 
	private int inputScore() throws Exception {
		int n = 0;
		
		try {
			n = sc.nextInt();
			if(n<0 || n>100){
				throw new Exception("μ •μˆ˜λŠ” 0~100κΉŒμ§€λ§Œ κ°€λŠ₯ν•©λ‹ˆλ‹€.");
			}
		} catch (InputMismatchException e) {
			sc.nextLine(); // 잘λͺ» μž…λ ₯ 된 것을 μ½μ–΄μ„œ 버림 
			//System.out.print("숫자만 μž…λ ₯ κ°€λŠ₯ν•©λ‹ˆλ‹€.");
			throw new Exception("숫자만 μž…λ ₯ κ°€λŠ₯ν•©λ‹ˆλ‹€.");
		}
		
		return n;
	}
}