[Java] μ˜ˆμ™Έμ²˜λ¦¬ (2)

μ •λ³΄κ΅¬λ‹ˆΒ·2022λ…„ 1μ›” 7일
1

Java

λͺ©λ‘ 보기
37/39
post-thumbnail

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


  • μ˜ˆμ™Έ 클래슀의 μ΅œμƒμœ„ ν΄λž˜μŠ€λŠ” Throwable이며, 이λ₯Ό μƒμ†ν•˜λŠ” μ˜ˆμ™Έ ν΄λž˜μŠ€κ°€ μ„Έ λΆ€λ₯˜λ‘œ λ‚˜λ‰œλ‹€.
    • Error 클래슀λ₯Ό μƒμ†ν•˜λŠ” μ˜ˆμ™Έ 클래슀
    • Exception 클래슀λ₯Ό μƒμ†ν•˜λŠ” μ˜ˆμ™Έ 클래슀
    • RuntimeException 클래슀λ₯Ό μƒμ†ν•˜λŠ” μ˜ˆμ™Έ 클래슀



Error 클래슀λ₯Ό μƒμ†ν•˜λŠ” μ˜ˆμ™Έ 클래슀

  • Error 클래슀λ₯Ό μƒμ†ν•˜λŠ” μ˜ˆμ™Έ 클래슀의 μ˜ˆμ™Έ 상황은 μ‹œμŠ€ν…œ 였λ₯˜ μˆ˜μ€€μ˜ μ˜ˆμ™Έ μƒν™©μœΌλ‘œ
    ν”„λ‘œκ·Έλž¨ λ‚΄μ—μ„œ 처리 ν•  수 μžˆλŠ” μˆ˜μ€€μ˜ μ˜ˆμ™Έκ°€ μ•„λ‹ˆλ‹€.
    ( 예λ₯Ό λ“€μ–΄ ν•˜λ“œλ””μŠ€ν¬μ— 물리적 였λ₯˜κ°€ λ°œμƒν•΄ νŒŒμΌμ— μ €μž₯된 데이터λ₯Ό 읽을 수 μ—†λŠ” 상황 )

  • λ”°λΌμ„œ Error 클래슀λ₯Ό μƒμ†ν•˜λŠ” μ˜ˆμ™ΈλŠ” 처리의 λŒ€μƒμ΄ μ•„λ‹ˆλ‹€.
    ( 이런 μœ ν˜•μ˜ μ˜ˆμ™Έ λ°œμƒ μ‹œ κ·Έλƒ₯ ν”„λ‘œκ·Έλž¨μ΄ μ’…λ£Œλ˜λ„λ‘ 두고 이후에 원인을 νŒŒμ•…ν•˜λŠ” 과정을 가짐)

  • ex)

    • VirtualMachineError : 가상머신에 μ‹¬κ°ν•œ 였λ₯˜ λ°œμƒ
    • IOError : μž…μΆœλ ₯ κ΄€λ ¨ν•΄μ„œ μ½”λ“œ μˆ˜μ€€ 볡ꡬ가 λΆˆκ°€λŠ₯ν•œ 였λ₯˜ λ°œμƒ





RuntimeException 클래슀λ₯Ό μƒμ†ν•˜λŠ” μ˜ˆμ™Έ 클래슀

  • RuntimeException ν΄λž˜μŠ€λŠ” Exception 클래슀λ₯Ό μƒμ†ν•œλ‹€.

  • λŒ€λΆ€λΆ„ μ½”λ“œ 였λ₯˜λ‘œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έμ΄λ‹€.

  • 이 μœ ν˜•μ˜ μ˜ˆμ™Έ λ°œμƒμ‹œ μ½”λ“œμ˜ μˆ˜μ •μ„ κ³ λ €ν•΄μ•Όν•œλ‹€.
    ( ν”„λ‘œκ·Έλž˜λ¨Έ μ‹€μˆ˜μ— μ˜ν•œ μ˜ˆμ™ΈμΈ κ²½μš°λŠ” μ½”λ“œλ₯Ό μˆ˜μ •ν•΄μ•Ό ν•  μƒν™©μ΄μ§€λ§Œ, λ“œλ¬Όκ²Œ ν”„λ‘œκ·Έλž¨ μ‚¬μš©μžμ˜ μ‹€μˆ˜λ‘œ 인해 이 μœ ν˜•μ˜ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λŠ” κ²½μš°κ°€ 있기 λ•Œλ¬Έμ— μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ•Ό ν•˜λŠ” κ²½μš°κ°€ μžˆμ„ 수 μžˆλ‹€. )

  • μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ£Όμ§€ μ•Šμ•„λ„ 컴파일 였λ₯˜κ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.
    ➑ λ°˜λ“œμ‹œ μ˜ˆμ™Έ 처리λ₯Ό ν•΄μ€˜μ•Ό ν•˜λŠ” μœ ν˜• X

  • ex)

    • ArithmeticException
    • ClassCastException
    • IndexOutOfBoundsException
    • NegtiveArraySizeException : λ°°μ—΄ μƒμ„±μ‹œ 길이λ₯Ό 음수둜 μ§€μ •ν•˜λŠ” μ˜ˆμ™Έ λ°œμƒ
    • NullPointerException
    • ArrayStoreException : 배열에 적절치 μ•Šμ€ μΈμŠ€ν„΄μŠ€λ₯Ό μ €μž₯ν•˜λŠ” μ˜ˆμ™Έ λ°œμƒ





Exception 클래슀λ₯Ό μƒμ†ν•˜λŠ” μ˜ˆμ™Έ 클래슀

  • μ½”λ“œμ˜ 문법적 였λ₯˜κ°€ μ•„λ‹Œ, ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ κ³Όμ •μ—μ„œ λ°œμƒν•˜λŠ” μ˜ˆμ™Έμ  상황을 ν‘œν˜„ν•˜κΈ° μœ„ν•œ ν΄λž˜μŠ€μ΄λ‹€.
  • λ”°λΌμ„œ μ˜ˆμ™Έ 처리λ₯Ό μ–΄λ–»κ²Œ ν•  것인지 λ°˜λ“œμ‹œ λͺ…μ‹œν•΄μ€˜μ•Ό ν•œλ‹€.
  • μ˜ˆμ™Έμ²˜λ¦¬λ₯Ό ν•΄μ£Όμ§€ μ•ŠμœΌλ©΄ 컴파일 였λ₯˜κ°€ λ°œμƒν•œλ‹€.
  • ex)
    • java.io.IOException : μž…μΆœλ ₯ κ΄€λ ¨ μ˜ˆμ™Έ 상황을 ν‘œν˜„ν•˜λŠ” μ˜ˆμ™Έ 클래슀
  • μ˜ˆμ™Έμ²˜λ¦¬ 방법
    • try catch문을 톡해 μ˜ˆμ™Έλ₯Ό 직접 처리
    • thows절 선언을 μΆ”κ°€ν•΄ μ˜ˆμ™Έμ˜ 처리λ₯Ό λ„˜κΉ€











ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ •μ˜ν•˜λŠ” μ˜ˆμ™Έ 클래슀


μ§€κΈˆκΉŒμ§€ μ†Œκ°œν•œ μ˜ˆμ™Έ ν΄λž˜μŠ€λŠ” λͺ¨λ‘ μžλ°”μ—μ„œ μ •μ˜ν•œ ν΄λž˜μŠ€μ˜€λ‹€.
ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 직접 μ˜ˆμ™Έ 클래슀λ₯Ό μ •μ˜ν•˜κ³  이λ₯Ό 기반으둜 νŠΉμ • μƒν™©μ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜λ„λ‘ ν•  수 μžˆλ‹€.



πŸ”Ž νŠΉμ§•

  • ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ •μ˜ν•˜λŠ” μ˜ˆμ™Έ ν΄λž˜μŠ€λŠ” Exception 클래슀λ₯Ό μƒμ†ν•œλ‹€.
    • λ”°λΌμ„œ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μ •μ˜ν•˜λŠ” μ˜ˆμ™Έ ν΄λž˜μŠ€λ„ try~catch문으둜 처리λ₯Ό ν•˜κ±°λ‚˜ throws선언을 톡해 λ„˜κ²¨μ•Ό ν•œλ‹€.
  • μ˜ˆμ™Έ 상황에 λŒ€ν•œ 원인 λ©”μ„Έμ§€λ₯Ό ν”„λ‘œκ·Έλž˜λ¨Έκ°€ μž‘μ„±ν•  수 μžˆλ‹€.
  • throw 선언을 톡해 μ˜ˆμ™Έ μΈμŠ€ν„΄μŠ€λ₯Ό 직접 λ§Œλ“€κ³  μ˜ˆμ™Έ λ©”μ»€λ‹ˆμ¦˜μ„ κ΅¬λ™μ‹œν‚€λ„λ‘ ν•  수 μžˆλ‹€.

import java.util.Scanner;

class ReadAgeException extends Exception {  // μ˜ˆμ™Έ 클래슀 μ •μ˜
	public ReadAgeException() {
		super("μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚˜μ΄κ°€ μž…λ ₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€.");  // μ˜ˆμ™Έ 상황에 λŒ€ν•œ 원인 λ©”μ„Έμ§€ μž‘μ„±
	}
}

class MyExceptionClass {
	public static int readAge() throws ReadAgeException {
		Scanner kb = new Scanner(System.in);
		int age = kb.nextInt();
		
		if (age < 0)
			throw (new ReadAgeException());	// throw 선언을 톡해 μ˜ˆμ™Έ λ°œμƒ
		
		return age;
	}
	
	public static void main(String[] args) {
		System.out.print("λ‚˜μ΄ μž…λ ₯: ");
		
		try {
			int age = readAge();
			System.out.printf("μž…λ ₯된 λ‚˜μ΄: %d \n", age);
		}
		catch(ReadAgeException e) {
			System.out.println(e.getMessage());
		}
	}
}


// μ‹€ν–‰ κ²°κ³Ό
λ‚˜μ΄ μž…λ ₯: -11
μœ νš¨ν•˜μ§€ μ•Šμ€ λ‚˜μ΄κ°€ μž…λ ₯λ˜μ—ˆμŠ΅λ‹ˆλ‹€.











잘λͺ»λœ catchꡬ문의 ꡬ성


// λ‹€μŒ μ„Έκ°œμ˜ μ˜ˆμ™Έ ν΄λž˜μŠ€κ°€ μ •μ˜
class FirstException extends Exception {...}
class SecondException extends FirstException {...}
class ThirdException extends SecondException {...}


// μœ„ μ„Έμ’…λ₯˜ μ˜ˆμ™Έμ— λŒ€ν•΄ try~catchλ¬Έ ꡬ성
try {
    ...
}

catch(FirstException e) {...}
catch(SecondException e) {...}
catch(ThirdException e) {...}

// μ‹€ν–‰ κ²°κ³Ό
// 컴파일 였λ₯˜ λ°œμƒ!!

πŸ”Ž 컴파일 였λ₯˜κ°€ λ‚˜λŠ” 이유?

  • 상속 관계
    ThirdException ➑ SecondException ➑ FirstException ➑
    Exception
  • 첫번째 catch(FirstException e) {...}μ—μ„œ λͺ¨λ“  μ˜ˆμ™Έμ˜ μΈμŠ€ν„΄μŠ€λ₯Ό μ²˜λ¦¬ν•  수 있기 λ•Œλ¬Έμ—, λ‘λ²ˆμ§Έ μ„Έλ²ˆμ§Έ catch ꡬ문은 싀행될 일이 μ—†λ‹€.
    ➑ λ”°λΌμ„œ μ»΄νŒŒμΌλŸ¬κ°€ 였λ₯˜λ₯Ό λ°œμƒμ‹œμΌœ κ²½κ³ ν•΄μ€Œ



πŸ”Ž λͺ¨λ“  catchꡬ문이 μ‹€ν–‰λ˜λ €λ©΄?

  • catch ꡬ문의 μˆœμ„œλ₯Ό λ°”κΏ”μ€˜μ•Ό ν•œλ‹€.
try {
    ...
}

catch(ThirdException e) {...}
catch(SecondException e) {...}
catch(FirstException e) {...}






finally


πŸ”Ž 기본ꡬ쑰

  • try ~ catch문은 ν•˜λ‚˜μ˜ λ¬Έμž₯μ΄λ―€λ‘œ try문만 μ‘΄μž¬ν•  수 μ—†μ§€λ§Œ, catchλ¬Έ 없이 try ~ finally문으둜 λ‘˜ 수 μžˆλ‹€.
try {
    ...
}
finally {...} 
  • λ˜λŠ” try ~ catch ~ finallyλ₯Ό ν•˜λ‚˜μ˜ λ¬Έμž₯으둜 묢을 수 μžˆλ‹€.
try {
    ...
}
catch(Exception name) {
   ...
}
finally {...}  



πŸ”Ž νŠΉμ§•

  • μ½”λ“œμ˜ 싀행이 try μ•ˆμœΌλ‘œ μ§„μž…ν•˜λ©΄ finallyꡬ문은 무쑰건 μ‹€ν–‰ λœλ‹€.
  • tryμ—μ„œ μ˜ˆμ™Έκ°€ λ°œμƒν•˜κ±΄ μ•ˆ ν•˜κ±΄, catchκ°€ μ‹€ν–‰λ˜κ±΄ μ•ˆλ˜κ±΄, 무쑰건 μ‹€ν–‰λ˜λŠ” ꡬ문이닀.



πŸ”Ž κ΄€λ ¨ 예제

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

public class FinallyCase {
	public static void main(String[] args) {
		Path file = Paths.get("C:\\Users\\anneu\\Desktop\\study_java\\Simple.txt");
		BufferedWriter writer = null;
		
		try {
			writer = Files.newBufferedWriter(file);	// IOException λ°œμƒ κ°€λŠ₯
			writer.write('A');	// IOException λ°œμƒ κ°€λŠ₯
			writer.write('Z');	// IOException λ°œμƒ κ°€λŠ₯
		}
		catch(IOException e) {
			e.printStackTrace();
		}
		finally {
			try {
				if(writer != null)
					writer.close();  // IOException λ°œμƒ κ°€λŠ₯
			}
			catch(IOException e) {
				e.printStackTrace();
			}
		}
	}
}
  • μ‹€ν–‰μ˜ 흐름이 try μ•ˆμœΌλ‘œ λ“€μ–΄μ˜€λ©΄ finally ꡬ문은 λ°˜λ“œμ‹œ μ‹€ν–‰λ˜λ―€λ‘œ close λ©”μ†Œλ“œ 호좜이 보μž₯λœλ‹€.
  • close의 ν˜ΈμΆœλ¬Έμ—μ„œ IOException μ˜ˆμ™Έκ°€ λ°œμƒν•  수 있기 λ•Œλ¬Έμ— finally λ‚΄μ—μ„œ try~catch문을 μž‘μ„±ν•΄μ€˜μ•Ό ν•œλ‹€.











try-with-resources


  • try에 이어 λ“±μž₯ν•˜λŠ” μ†Œκ΄„ν˜Έ μ•ˆμ— μ’…λ£Œμ˜ 과정을 ν•„μš”λ‘œ ν•˜λŠ” λ¦¬μ†ŒμŠ€λ₯Ό 생성할 수 μžˆλ‹€.
  • 그러면 이 λ¦¬μ†ŒμŠ€λŠ” try-with-resources문을 λΉ μ Έλ‚˜μ˜€λ©΄μ„œ μžλ™μœΌλ‘œ μ’…λ£Œλœλ‹€.
// try-with-resources문 기본 ꡬ쑰
try(resource) {
    ...
}
catch(Exception name) {
    ...
}


// λ‘˜ μ΄μƒμ˜ λ¦¬μ†ŒμŠ€λ₯Ό κ°–λŠ” try-with-resources문의 ꡬ쑰
try(resource1; resource2) {  // μ„Έλ―Έμ½œλ‘ μœΌλ‘œ λ¦¬μ†ŒμŠ€ ꡬ뢄
    ...
}
catch(Exception name) {
    ...
}



πŸ”Ž try-with-resources 기반의 μ˜€ν”ˆ 및 μ’…λ£Œ λŒ€μƒμ΄ 되기 μœ„ν•œ 쑰건

  • java.lang .AutoCloseable μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜κ³  있으면 λŒ€μƒμ΄ 될 수 μžˆλ‹€.





πŸ”Ž κ΄€λ ¨ 예제

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

class TryWithResourceCase {
	public static void main(String[] args) {
		Path file = Paths.get("C:\\Users\\anneu\\Desktop\\study_java\\Simple.txt");
		
		try(BufferedWriter writer = Files.newBufferedWriter(file)) {
			writer.write('A');
			writer.write('Z');
		}
		catch(IOException e) {
			e.printStackTrace();
		}
	}
}











μ°Έκ³ 
μ—΄ν˜ˆ μžλ°” ch18-2 (μ˜ˆμ™Έμ²˜λ¦¬μ— λŒ€ν•œ λ‚˜λ¨Έμ§€ μ„€λͺ…λ“€)

1개의 λŒ“κΈ€

comment-user-thumbnail
2022λ…„ 1μ›” 7일

λ„ˆλ¬΄ 이해가 μž˜λΌμš”πŸ€Ÿ

λ‹΅κΈ€ 달기