☭DEVELOPER/#2 웹개발(자바기반 풀스택)

[BACKEND]JAVA_ECLIPSE23 예외 처리

조반짝 2023. 8. 29. 18:22
728x90
반응형

Exeception 예외처리

예외처리(exception handling)

 


 

package chapter10.sec01.exam01;

// 자바 프로그램에서 가장 빈번하게 발생하는 실행 예외는 java.lang.NullPointerExceptionExample 입니다.
// 이것은 객체 참조가 없는 상태, 즉 null 값을 갖는 참조 변수로 객체 접근 연산자인 도트(.)를 사용했을 때
// 발생합니다. 객체가 없는 상태에서 객체를 사용하려 했기 때문에, 예외가 발생한 것입니다.
// NullPointerException 활용 예시입니다.
public class NullPointerExceptionExample {

	public static void main(String[] args) {
		
//		String data = null; //스트링 타입에 숫자를 넣어서 exception 발생
		
		String data = "장나라";
		System.out.println(data.toString());  //장나라
	
	
	}
	
	
}

데이터가 없는데 억지로 읽으려해서 예외가뜸

 

run configuration 에서

인수를 넣으면 실행이된다.

 

 


package chapter10.sec01.exam03;

// 앞서 exam02 패키지 안에 있었던 ArrayIndexOutOfBoundsExceptionExample 실행 클래스를
// 다음과 값이 수정하면 ArrayIndexOutOfBoundsException이 발생하지 않는 좋은 프로그램이 됩니다.
// 배열 값을 읽기 전에 배열의 길이를 먼저 조심하게 하고, 실행 매개값이 없거나 부족할 경우에는
// 조건문을 이용해서 사용자에게 알려주게합니다.
public class ArrayIndexOutOfBoundsExceptionExample {

	public static void main(String[] args) {
		if (args.length == 2) {
			String data1 = args[0];
			System.out.println("args[0] =" + data1);
			String data2 = args[1];
			System.out.println("args[1] =" + data2);
		} else {
			System.out.println("두개의 실행 매개값이 필요합니다!");
		}
	}
}

numberformatexception

package chapter10.sec01.exam04;

// NumberFormatExceptionExample 활용예시입니다.
public class NumberFormatExceptionExample {
	
	public static void main(String[] args) {
		String data1 = "100";
		
		int value1 = Integer.parseInt(data1);
		
//		String data2 = "a100";

		String data2 = "200";
		
		
		
		int value2 = Integer.parseInt(data2); //NumberFormatException발생
		
		int result =value1 + value2;
		System.out.println(data1 + "+" + data2 + "=" + result);
		//100+200=300
	}

}

 


ClassCaseException

package chapter10.sec01.exam05;

// 최상위 부모 클래스 Animal 클래스 선언
class Animal{
	void cry() {
		System.out.println("동물은 소리를 냅니다!");
	}
}

// Animal 부모 클래스를 상속하는 Dog 자식 클래스 선언
class Dog extends Animal{
	@Override
	void cry() {
		System.out.println("강아지가 멍멍~ 소리를 냅니다!");
	}
}

// Animal 부모 클래스를 상속하는 Cat 자식 클래스 선언
class Cat extends Animal{
	@Override
	void cry() {
		System.out.println("고양이가 야옹 소리를 냅니다!");
	}
	
}


// ClassCaseException 발생 예시 소스 코딩입니다!
public class ClassCaseExceptionExample {
	
	public static void main(String[] args) {
		
		Animal animaDog = new Dog();
		changeDog(animaDog);
		
		Animal animalCat = new Cat();
		changeDog(animalCat);
		
//		Dog dog = new Dog();
//		changeDog(dog);
//		
//		Cat cat = new Cat();
//		changeDog(cat);
	}

	public static void changeDog(Animal animal) {
		
		if (animal instanceof Dog) {
			Dog dog = (Dog) animal;
			System.out.println("changeDog-dog 타입변환 성공!");
			dog.cry();
		} else if (animal instanceof Cat) {
			Cat cat = (Cat) animal;
			System.out.println("changeCat-cat 타입변환 성공!");
			cat.cry();
		}
//		Dog dog = (Dog) animal; //ClassCaseException 발생
	}
}

////changeDog-dog 타입변환 성공!
//강아지가 멍멍~ 소리를 냅니다!
//changeCat-cat 타입변환 성공!
//고양이가 야옹 소리를 냅니다!


 

예외처리 : 에러를 핸들링함.

try: 문제가 있는지 시도

catch: 문제가 있는곳으로 던진다.

finally: catch 문이 되든 안되는 무조건 동작한다. 생략가능하다.


일반예외 처리를 위해 TryCatchFinallyExample 실행 클래스를 소스코딩합니다.

 

javalang 패키지는 디폴트이기 때문에 Import 하지않아도 된다.

javalang package > string.class

 

package chapter10.sec02.exam01;

//일반예외 처리를 위해 TryCatchFinallyExample 실행 클래스를 소스코딩합니다.
public class TryCatchFinallyExample {

	public static void main(String[] args) {
		
		try {
			Class clazz = Class.forName("java.lang.String");
			System.out.println("클래스가 존재합니다.");
		} catch (ClassNotFoundException e) {
//			e.printStackTrace(); //에러가 났을 때 보여줌
			System.out.println("클래스가 존재하지않습니다.");
		}
	}
}

package chapter10.sec02.exam01;

//일반예외 처리를 위해 TryCatchFinallyExample 실행 클래스를 소스코딩합니다.
public class TryCatchFinallyExample {

	public static void main(String[] args) {
		
		try {
			Class clazz = Class.forName("java.lang.String");
//			Class clazz = Class.forName("java.lang.String2"); //문제상황 만들어보기
			System.out.println("클래스가 존재합니다."); //클래스가 존재합니다.
		} catch (ClassNotFoundException e) {
//			e.printStackTrace(); //에러가 났을 때 보여줌
			System.out.println("클래스가 존재하지않습니다.");
		} finally {
			System.out.println("finally 문은 try~ catch 문에서 무조건 실행됩니다");
		}
	}
}

실행 예외 처리

 

다중 catch

package chapter10.sec02.exam03;

// 여러개의 catch를 활용하는 다중 catch 이해를 CatchByExceptionKindExample 실행 클래스를 코딩합니다.

public class CatchByExceptionKindExample {

	public static void main(String[] args) {
		try {
			String data1 = args[0];
			String data2 = args[1];
			int value1 = Integer.parseInt(data1);
			int value2 = Integer.parseInt(data2);
			int result = value1 + value2;
			System.out.println(data1 + "+" + data2 + "=" + result);			
		} catch(ArrayIndexOutOfBoundsException e) {
			System.out.println("실행 매개값의 수가 부족합니다!");
		} catch(NumberFormatException e) {
			System.out.println("숫자로 변환할 수 없습니다");
		}finally {
			System.out.println("다시 실행하세요");
		}
		
	}
}

한번에 사용하기

package chapter10.sec02.exam03;

// 여러개의 catch를 활용하는 다중 catch 이해를 CatchByExceptionKindExample 실행 클래스를 코딩합니다.

public class CatchByExceptionKindExample2 {

	public static void main(String[] args) {
		try {
			String data1 = args[0];
			String data2 = args[1];
			int value1 = Integer.parseInt(data1);
			int value2 = Integer.parseInt(data2);
			int result = value1 + value2;
			System.out.println(data1 + "+" + data2 + "=" + result);			
		} catch(ArrayIndexOutOfBoundsException|NumberFormatException e) {
			System.out.println("예외가 발생했습니다!");
		}finally {
			System.out.println("다시 실행하세요");
		}
		
	}
}

catch 순서

다중 catch 블록을 작성할 떄 주의할 점은 상위 예외클래스가 하위 예외 클래스보다 아래쪽에 위치해있어야한다.


catch 블록의 순서

 

catch 순서의 오류

 


throws 예외 떠넘기기(예외 미루어 처리하기)

 

throws 키워드가 붙어있는 메소드는 반드시 try 블록 내에서 호출되어야한다.

그리고 catch 블록에서 떠넘겨 받은 예외를 처리해야한다.

 


throws

 

package chapter10.sec02.exam05;

// 예외 처리 떠넘기기(예외 미루어 처리하기) 이해를 위해 ThrowsExample 실행 클래스를 소스코딩합니다.
public class ThrowsExample {

	public static void main(String[] args) {
		
		try {
			findClass();
			System.out.println("클래스가 존재합니다");
		} catch (ClassNotFoundException e) {
			System.out.println("클래스가 존재하지 않습니다");
		}
	}

	public static void findClass() throws ClassNotFoundException {
		Class clazz = Class.forName("java.lang.String");
		Class clazz = Class.forName("java.lang.String2");
	}
}

개발하다가 예외가 발생하다가 상황에따라 나오는데 이를 알기 위해 테스트 용으로 예외를 강제로 발생시킨다.

이때 throw명령어를 사용한다.

 

 

package chapter10.sec02.exam05;

// throw 명령어는 예외를 강제로 발생하게합니다.
// 개발시 예외를 테스트할 때 사용
public class ThrowExample {

	public static void main(String[] args) {
		System.out.println("★ main() 함수가 제일 먼저 실행됨을 확인합니다!");
		handlingException();
		
	}
	
	private static void handlingException() {
		try {
			throw new Exception();
		} catch (Exception e) {
			System.out.println("호출된 메서드에서 예외가 처리됩니다.");
		}
	}
}

 

728x90
반응형