프로그래밍/Java 공부

Java- Exception 예외처리

개발계발게발 2021. 6. 16. 18:07
반응형

Exception 예외처리 

 자바 예외 핸들링
 자바에서는 예외라는 것을 두고 목적에 따라서 처리(핸들링)하도록 설계되어있다.
  
 예외는 주로 실행시에 발생되는 모든 에러 상황을 예외로 정한다.
 물론 특정 API는 컴파일시 예외를 처리하지 않으면 컴파일 되지 않는 예외들도 있다.
  
 예외의 정의
 실행시 발생할 수 있는 모든 에러 상황들
  
 자바에서는 예외가 발생되는 순서가 대략 아래와 같다.


 컴파일 -> 실행 -> 실행중 예외 발생 -> VM이 발생한 예외의 종류 및 내용을 파악한 뒤 예외 객 체생성
 -> 발생된 코드 밖으로 예외 던지기(throw) -> 예외의 콜 스택에 전이
 -> main메소드 밖까지 던지게 되면 프로그램 비정상 종료
  
 위처럼 예외는 던진다 라고 표현


 또한 예외는 객체이기 때문에 당연히 클래스로 정의되어 있다.
  
 예외의 최고 클래스는 lang패키지의 Throwable이다.
 자식으로는 Error와 Exception이 있다.
  
 Error 하위 타입은 일반적으로 java 실행기 즉 VM에 관련된  에러 상황들을 정의한 클래스이다.
 이러한 문제(상황)들은 프로그래머가 처리할 수 없는 것들로  VM 즉 JRE 전반적인 문제이다.
 따라서 프로그래머는 Error 하위 타입들의 예외(에러)는  처리하지 않고 무시한다.(처리할 수 없다.)
  
 다음 Exception이란 클래스의 하위 타입이 
 바로 프로그래머가 처리해야 할 예외 타입들이다.
  
 따라서 보통 예외다라고 표현할 때 최고 클래스로는 Exception클래스를 말한다
  
  Throwable 클래스는 자식 클래스로 Error를 가지고 있기 떄문에
  예외의 최고 클래스로 표현하지 않는다.
   
   
  예외의 종류
  크게 두가지로 나뉜다.
  컴파일러가 관여하지 않으면서 실행시에 예외가 발생할수도
  발생하지 않을수도 있는 예외를


  [알려지지 않은 예외 (Unchecked Exception)]
   
  컴파일러가 관여하는 예외인 [알려진 예외 (Checked Exception)]로 구분
   
  구분 방법은?
  Exception하위 클래스 중 RuntimeException이 있는데   해당 클래스의 자식 클래스들은 모두 알려지지 않은 예외이다.
  나머지는 알려진 예외이다.
   
  컴퓨터 하드웨어의 오작동 또는 고장으로 인해 응용프로그램 실행오류가 발생하는 것을 자바에서는 에러라고 말한다.
  에러는 JVM 실행에 문제가 생겼다는 것이므로 JVM위에서 실행되는 프로그램을

  아무리 견고하게 만들어도 결국 실행 불능이 된다. 개발자는 이러한 에러를 극복할 방법이 없다.

이런 에러가 아닌 다른 에러를 예외라고 한다.
예외란 사용자의 잘못도니 조작 또는 개발자의 잘못된 코딩으로 인해
발생하는 프로그램 오류를 말한다. 예외가 발 생되면 프로그램은 바로 종료된다.(이건 에러와 비슷)
그러나 예외는 예외처리라는 것을 통해 프로그램을 종료하지 않고 정상실행상태가 유지되도록 할 수 있다.

public class Exception01 {
	public static void main(String[] args) {
		
		int[] ia = new int[5];
		try {	
		System.out.println(ia[0]);
		System.out.println(ia[1]);
		System.out.println(ia[2]);
		System.out.println(ia[3]);
		System.out.println(ia[5]);
			
		} catch (Exception e) {
			System.out.println("예외가 발생했으나");
			System.out.println("처리 완료");
		}
		System.out.println("완료. 프로그램 종료.");		
	}
}

 

try를 활용하여 오류를 막고 다른 부분까지 실행되게 할수 있다.


1. 직접 처리

	try{
		예외가 발생할만한 코드;
	}catch(Exception e){
		예외가 발생하면 실행할 코드;
	}finally{
	예외 발생 유무와 상관없이 반드시 실행해야 할 코드;
	//close();
	}

 

2. 던지기(throw)  

 메소드 뒷부분에 throw 처리할 예외타입을 적어준다.
 메소드가 실행되다가 예외를 만나면 메소드를 호출한쪽으로 예외를 던진다.
 main 메소드는 VM으로 던진다.    


3. 직접 예외 객체 만들어서 처리하기

예외 객체를 만들어서 처리하기 

		throw 객체명;
 			@Overiide
			public void printStrankTrace(){
				super.printstrackTrace();
				System.out.println("계산 불가");
			} 

 

ArithmeticException, ArrayIndexOutOfBoundsException 예외처리 예제

public class Exception02 {
	public static void main(String[] args) {
		try {
			int[] ia = {10, 20, 30 ,40, 50};
			System.out.println(ia[5]);
			System.out.println(10/0);	
			
			System.out.println("try 문장 속");
		} catch (ArithmeticException e) {
			System.out.println("0으로 나누려고 시도 중 예외 발생");
		} catch (ArrayIndexOutOfBoundsException e) {
			System.out.println("배열 범위 밖 예외 발생");
		}finally {
			System.out.println("예외발생과 관계 없이 실행");
		}		
		System.out.println("프로그램 종료");
	}
}
public class Exception03 {
	public static void main(String[] args) {

		try {
			
			try {
				int[] ia = new int[5];
				ia[5] = 100;

			} catch (ArrayIndexOutOfBoundsException e) {
				System.out.println("배열 범위 밖");
			}
			System.out.println(10 / 0);

		} catch (ArithmeticException e) {
			System.out.println("0으로 나누려고 한다.");
		} finally {
			System.out.println("여기까지");
		}

	}
}

FileNotFoundException 예외처리

import java.io.FileReader;
import java.io.IOException;

public class Exception04 {
	public static void main(String[] args) {
	
		FileReader fr = null;
		try {
			fr = new FileReader("c:/temp/Hello.java");
			
			int data;
			
			while(true) {
				data = fr.read();
				if(data == -1) {
					break;
				}else {
					System.out.print((char)data);
				}
			}
		} catch (Exception e) {
			System.out.println("파일이 없습니다.");
		}finally {
			try {
				fr.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

트렌젝션 : 묶음. 여러 명령어들을 하나로 묶어서 처리한다.
     3개의 명령어가 들어있는 트렌젝션이 있으면
     2개 성공, 1개 실패라면 모두 취소 시켜야 한다.

try{     
	포장(); 
	영수증발행(); 
	택배발송();         
}catch(){      
	취소();            
}
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class Exception09 {
	public static void main(String[] args) {
		System.out.println("메인메소드 시작");
		
		//BufferedReader
		BufferedReader br = null;		
	
		try {
			br = new BufferedReader(new FileReader("c:\\temp\\test.txt"));
			try {
				int number = 5 / 0;				
			} catch (ArithmeticException e) {
				System.out.println("0으로 나눌수 없습니다.");
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
			System.out.println("파일이 없습니다.");
		}		
		int number = 0;
		try {
			number = Integer.parseInt("100T");			
		} catch (NumberFormatException e) {
			number=10;
		}
		System.out.println(number);
		
		System.out.println("메인메소드 끝");
	}
}

 

파일 입출력

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

//파일 입출력

public class Exxception08 {
	public static void main(String[] args) {
		
		//1. 파일 만들기
		//FileReader = 파일을 읽어서 자바로 가져오기
		FileReader fr = null;
		
		try {
			fr = new FileReader("c:\\temp\\test.txt");
			int data;
			while(true) {
				data = fr.read();
				if(data == -1) {//-1은 더이상 읽을 데이터가 없을때
					break;
				}
				//-1이 아니라면 읽어온 글자 출력하기
				System.out.print((char)data);
			}
			
		} catch (FileNotFoundException e) {			
			//e.printStackTrace();
			System.out.println("파일이 없습니다.");			
		} catch (IOException e) {
			//e.printStackTrace();
			System.out.println("파일을 읽을 수 없습니다.");
		} finally {
			try {
				fr.close();	//fr 닫기
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}

 

반응형

'프로그래밍 > Java 공부' 카테고리의 다른 글

Java와 MariaDB 연동(INSERT, UPDATE, READ, DELETE) 예제  (0) 2021.06.17
Java와 MariaDB 데이터 연동 예제  (0) 2021.06.17
2진트리 BinaryTree, TreeSet  (0) 2021.06.16
스택-Stack, 큐-Queue  (0) 2021.06.16
Map 출력  (0) 2021.06.16