본문 바로가기

Java

Java(18) - 오류, 예외 클래스, 예외 처리

728x90
반응형

1) 예외

   1-1) 오류

   1-2) 예외 클래스(Exception Class)

   1-3) 예외 처리(Exception Handling)

2) 예제 풀이

 

 

 

 

1) 예외

1-1) 오류

 

 

 

1-2) 예외 클래스(Exception Class)

 

 

 

 

 

1-3) 예외 처리(Exception Handling)

 

 

  • try-catch 문
  • try-catch-finally 문
  • try-with-resource 문
  • throws(예외처리 미루기)
  • 다중 예외 처리
  • 사용자 정의 예외

 

(중요 Point!!) 에러가 발생되는 시점에 해당 에러에 대한 인스턴스가 생성되고,

이 인스턴스를 catch 문에서 “e”라는 변수에 저장하여 사용하는 것이다!

 

예외 처리는 프로그램이 온전히 실행될 수 있도록 하기 위한 것으로

, 실행 중간에 예외로 인한 실행 중단이 발생하지 않도록 하기 위해 수행한다!

 

에러 처리는 클래스의 일종으로

예외라는 인스턴스(혹은 객체)가 만들어지고

해당 인스턴스로부터 에러 문구를 출력하는 식의 에러 처리를 수행한다!

 

 

 

 

2) 예제 풀이

패키지 chapter15.exception

Exception_Test1.class

package chapter15.exception;

public class Exception_Test1 {

	public static void main(String[] args) {
		/*
		     * 예외처리(Exception handling)란
		     프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
		     프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것
		     
		     * 프로그램 오류
		       1) 컴파일 에러(Compile-time error) : 컴파일 할 때 발생하는 에러
		       2) 런타임 에러(runtime error) : 실행할 때 발생하는 에러
		       (문법에는 맞아 컴파일은 됐지만 실제로 JVM이 코드를 실행할 때
		       문제가 발생하는 경우)
		       3) 논리적 에러(logical error) : 작성 의도와 다르게 동작
		*/
		
		int a, b, c;
		a = 2;
		b = 0;
		// c = a / b;  // error 발생 시점 : ArithmeticException 에러가 발생함!  --> 여기서 "ArithmeticException" 예외 클래스이다!
		// System.out.println("c = " + c);
		
		/*
		// 위의 에러를 발생시키지 않기 위해 아래 if 문과 같이 에러처리함!
		if (b != 0) {
			c = a / b;
			System.out.println("c = " + c);
		} else {
			System.out.println("실행 종료");
		}
		*/
		
		try {
			c = a / b;  // 예외 발생 시점
			System.out.println("c = " + c);
		} catch (Exception e) {  // e : 예외 인스턴스를 저장하고 있음
			System.out.println(e.getMessage());  // 해당 에러에 대한 원인을 문구로 출력해 줌 
			e.printStackTrace();   // 해당 에러에 대한 정보를 보여줌
		}
		System.out.println("실행 종료");

	}

}

 

 

 

 

Exception_Test2.class

package chapter15.exception;

public class Exception_Test2 {

	public static void main(String[] args) {
		// 다중 예외 처리
		int a, b, c;
		a = 5;
		b = 3;
		int[] arr = {1, 2, 3, 4, 5};
		
		try {
			c = a / b;
			System.out.println("c = " + c);
			arr[5] = 100;   // ArrayIndexOutOfBoundsException 에러 발생 시점
		} catch (ArithmeticException e) {
			System.out.println("0으로 나누기 예외 발생");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("첨자가 배열 범위를 넘어섰습니다.");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
		System.out.println("프로그램 실행 완료");

	}

}

 

 

 

 

Exception_Test3.class

package chapter15.exception;

public class Exception_Test3 {

	public static void main(String[] args) {
		int a, b, c;
		a = 5;
		b = 3;
		int[] arr = {1, 2, 3, 4, 5};
		
		try {
			c = a / b;
			System.out.println("c = " + c);
			arr[5] = 100;
		} catch (ArithmeticException | ArrayIndexOutOfBoundsException e) {
			System.out.println("0으로 나누기 또는 배열 범위 초과 예외 발생");
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
		System.out.println("프로그램 실행 완료");

	}

}

 

 

 

 

Throw_Test1.class

package chapter15.exception;

public class Throw_Test1 {

	public static void main(String[] args) {
		// String name = "빌게이츠";
		String name = null;
		System.out.println("printScore 실행 전");
		printScore(name);

	}
	
	static void printScore(String name) {
		System.out.println("printScore 메서드 실행");
		try {
			System.out.println(name.length());   // NullPointerException 에러 발생 시점
		} catch (NullPointerException e) {
			System.out.println("이름이 무효합니다.");
		}
	}

}

 

 

 

 

Throw_Test2.class

package chapter15.exception;

public class Throw_Test2 {

	public static void main(String[] args) {
		String name = null;
		try {
			printScore(name);
		} catch (NullPointerException e) {
			System.out.println(e.getMessage());
		} 
		System.out.println("프로그램 종료");

	}
	
	static void printScore(String name) throws NullPointerException {    // "throws"는 해당 메서드에서 NullPointerException 에러를 처리하지 않겠다는 의미이다!(즉, 예외를 다른 곳으로 미룬다는 의미이다!)
		if (name == null) {
			// 예외 생성
			throw new NullPointerException("이름이 무효합니다.");   // "throw"는 여기서 다음과 같이 사용자가 지정한 에러를 생성해준다! 즉, 이 시점에 에러를 미리 발생시킨다고 이해하면 된다!
		}
		
		System.out.println(name.length());
	}

}

 

 

 

 

Throw_Test3.class

package chapter15.exception;

public class Throw_Test3 {

	public static void main(String[] args) {
		String name = null;
		try {
			printScore(name);
		} catch (Exception e) {
			e.printStackTrace();
		}
		System.out.println("프로그램 종료");

	}
	
	static void printScore(String name) throws Exception {
		if (name == null) {
			throw new Exception("이름이 무효합니다.");
		}
		System.out.println(name.length());
	}

}

 

 

 

 

User_Exception.class

package chapter15.exception;

class NegativeException extends Exception {
	NegativeException() {
		super("음수는 안돼요");
	}
}

public class User_Exception {

	public static void main(String[] args) {
		// 사용자 정의 예외 클래스
		int sum = 0;
		try {
			sum = calcSum(-100);
			System.out.println(sum);
		} catch (NegativeException e) {
			System.out.println(e.getMessage());
		}

	}
	
	static int calcSum(int to) throws NegativeException {
		if (to < 0) {
			throw new NegativeException();   // calcSum 메서드의 매개변수로 음수(ex. -100 등)를 넣으면 에러를 발생시키도록 여기서 에러 인스턴스를 생성함!
		}
		int sum = 0;
		for (int i = 0; i <= to; i++) {
			sum += i;
		}
		return sum;
	}

}

 

 

 

 

Finally_Test.class

package chapter15.exception;

import java.util.Scanner;

public class Finally_Test {

	public static void main(String[] args) {
		// finally : 예외와 상관없이 마지막에 무조건 실행되는 구문
		Scanner scan = new Scanner(System.in);
		
		System.out.println("접속");
		try {
			System.out.println("전송");
			
			System.out.println("입력: ");
			int a = scan.nextInt();
			System.out.println(a);
			
			throw new Exception();
		} catch (Exception e) {
			System.out.println("예외 처리");
		} finally {
			scan.close();
			System.out.println("해제");
		}
		System.out.println("프로그램 종료");

	}

}

 

 

 

 

Autoclose_Test.class

package chapter15.exception;

class NetAccess implements AutoCloseable {
	public void open() {
		System.out.println("접속");
	}
	public void send() {
		System.out.println("전송");
	}
	
	@Override
	public void close() {
		System.out.println("해제");
	}
}

public class Autoclose_Test {

	public static void main(String[] args) {
		// try-with-resources
		try (NetAccess na = new NetAccess()) {
			na.open();
			na.send();
		} catch (Exception e) {
			
		} finally {
			System.out.println("프로그램 종료");
		}

	}

}

 

 

 

 

IDFormatTest.class(userID가 8자 미만 혹은 20자 미만 초과한 경우 에러 처리)

package chapter15.exception;

import java.util.Scanner;

class IDFormatException extends Exception {
	public IDFormatException(String message) {
		super(message);
	}
}

public class IDFormatTest {
	String userID;
	
	public void checkUserID(String userID) throws IDFormatException {
		// 사용자 정의 예외 클래스 IDFormatException 생성
		// userID가 null일 경우
		//   => ERR "아이디는 null일 수 없습니다." 출력
		// userID가 8~20자가 아닐 경우
		//   => ERR "아이디는 8자 이상 20자 이하로 쓰세요." 출력
		
		if (userID == null) {
			throw new IDFormatException("아이디는 null일 수 없습니다.");
		} else if (userID.length() < 8 || userID.length() > 20) {
			throw new IDFormatException("아이디는 8자 이상 20자 이하로 쓰세요.");
		}
		System.out.println(userID);
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		IDFormatTest test = new IDFormatTest();
		
		System.out.print("ID: ");
		// String userID = null;    // userID가 "null"값인 경우, 에러 처리 확인을 위한 코드
		String userID = scan.next();
		
		try {
			test.checkUserID(userID);
		} catch (IDFormatException e) {
			System.out.println(e.getMessage());
		}

	}

}

 

 

 

 

IDFormatTest.class(userID가 null인 경우 에러 처리)

package chapter15.exception;

import java.util.Scanner;

class IDFormatException extends Exception {
	public IDFormatException(String message) {
		super(message);
	}
}

public class IDFormatTest {
	String userID;
	
	public void checkUserID(String userID) throws IDFormatException {
		// 사용자 정의 예외 클래스 IDFormatException 생성
		// userID가 null일 경우
		//   => ERR "아이디는 null일 수 없습니다." 출력
		// userID가 8~20자가 아닐 경우
		//   => ERR "아이디는 8자 이상 20자 이하로 쓰세요." 출력
		
		if (userID == null) {
			throw new IDFormatException("아이디는 null일 수 없습니다.");
		} else if (userID.length() < 8 || userID.length() > 20) {
			throw new IDFormatException("아이디는 8자 이상 20자 이하로 쓰세요.");
		}
		System.out.println(userID);
	}

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		IDFormatTest test = new IDFormatTest();
		
		System.out.print("ID: ");
		String userID = null;    // userID가 "null"값인 경우, 에러 처리 확인을 위한 코드
		// String userID = scan.next();
		
		try {
			test.checkUserID(userID);
		} catch (IDFormatException e) {
			System.out.println(e.getMessage());
		}

	}

}