Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

충분히 쌓여가는

11.2 예외 처리 코드 본문

이것이 자바다/11 예외 처리

11.2 예외 처리 코드

빌드이너프 2024. 4. 8. 11:05

예외 처리 코드

예외가 발생했을 때 프로그램의 갑작스러운 종료를 막고 정상 실행을 유지할 수 있도록 처리하는 코드

try-catch-finally 블록으로 구성됨

 

try 블록에서 작성한 코드가 예외 없이 정상 실행되면

catch 블록은 실행되지 않고 연이어 finally 블록이 실행된다

 

finally 블록

예외 발생 여부와 상관없이 finally 블록은 항상 실행된다

try 블록과 catch 블록에서 return문(메소드 종료)을 사용하더라도 finally 블록은 항상 실행된다

finally 블록은 옵션으로 생략 가능하다

 

예제

printLength(): 문자열의 수 return

package ch11.sec02.exam01;

public class ExceptionHandlingExample2 {
	public static void printLength(String data) {
		try {
			int result = data.length(); // data가 null일 경우 NullPointerException
			System.out.println("문자 수: " + result);
		} catch(NullPointerException e) {
			System.out.println(e.getMessage());
			System.out.println(e.toString());
			e.printStackTrace();
		} finally {
			System.out.println("[마무리 실행]\n");
		}
	}
	
	public static void main(String[] args) {
		System.out.println("[프로그램 시작]\n");
		printLength("Java");
		printLength(null);
		System.out.println("[프로그램 종료]");
	}
}
[프로그램 시작]

문자 수: 4
[마무리 실행]

Cannot invoke "String.length()" because "data" is null
java.lang.NullPointerException: Cannot invoke "String.length()" because "data" is null
java.lang.NullPointerException: Cannot invoke "String.length()" because "data" is null
	at ch11.sec02.exam01.ExceptionHandlingExample2.printLength(ExceptionHandlingExample2.java:6)
	at ch11.sec02.exam01.ExceptionHandlingExample2.main(ExceptionHandlingExample2.java:20)
[마무리 실행]

[프로그램 종료]

 

e.getMessage()

예외가 발생한 이유만 return

 

e.toString()

예외의 종류도 return

 

e.printStackTrace()

예외가 어디서 발생했는지 추적한 내용까지도 출력

 

 

예제

Class.forName("패키지...클래스")

: ClassPath 위치에서 주어진 클래스를 찾는 코드, 찾지 못했을 경우 ClassNotFoundException이라는 일반 예외 발생함

package ch11.sec02.exam02;

public class ExceptionHandlingExample {
	public static void main(String[] args) {
		try {
			Class.forName("java.lang.String");
			System.out.println("java.lang.String 클래스가 존재합니다");
		} catch(ClassNotFoundException e) {
			e.printStackTrace();
		}
		
		System.out.println();
		
		try {
			Class.forName("java.lang.String2");
			System.out.println("java.lang.String2 클래스가 존재합니다");
		} catch(ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}
java.lang.String 클래스가 존재합니다

java.lang.ClassNotFoundException: java.lang.String2
	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:525)
	at java.base/java.lang.Class.forName0(Native Method)
	at java.base/java.lang.Class.forName(Class.java:375)
	at ch11.sec02.exam02.ExceptionHandlingExample.main(ExceptionHandlingExample.java:15)