System.out.println("Hello, World");

문법 에러외의 다른 에어를 실행에러이다. 컴파일이 잘 되었음에도 실행 중에 에러가 발생하는 것이다. 실행 에러는 크게 세 가지로 나눌수 있는데, 논리적으로 잘못된 프로그램에서 발생하는 '논리 에러'와 프로그램 실행중의 특별한 상황 떄문에 발생하는 '예외', 그리고 컴퓨터 시스템에서 발생하는 '시스템 에러'이다. 논리에러는 프로그램을 완전히 잘못 작성한 경우로 해결방법은 다시 작성하는 수밖에 없다. 정전이나 하드 디스크 오류와 같은 시스템 에러는 사실 프로그래머가 어떻게 할 수 있는 성질의 것이 아니라서 사전에 예방 할 수 밖에 없다. 

예외라는 것은 프로그램이 정상적으로잘 작성되었는데에도, 실행하는 과정에서 여러 이유로 발생하는 에러를 말한다. 이처럼 프로그램이 정상적으로 잘 진행될 수 있는데, 실행중에 잘못된 입력이나 사용으로 발생하는 에러를 예외(Exception)라고 하고, 자바에서는 예외를 복구 할수 있는 방법을 제공한다.


 메소드

설명 

 ArithmeticException

0으로 나누려고 할 떄 발생 예 : (int i=12/0;) 

 NullPointerException

객체를 생성하기 전에 사용하려고 할때와 NULL값 

 NegativeArraySizeException

 배열의 크기를 음수로 줄때 발생

 ArrayIndexOfBoundsException

 첨자가 배열의 크기 범위를 벗어날 때 발생

 SecurityException

 애플릿이 보안을 위반했을때 발생

◎Try - catch 문

자바에서는 예외가 발생했을때, 이를 처리하기 위한 루틴으로 이동하는 것을 "던진다(throw)라고 말한다. 예외를 복구하는 방법은 ①예외가 발생할 가능성이 있는 부분을 try 명령으로 감싸고 예외가 발생한 메시지를 던진 후 ② catch 명령으로 try가 던진 예외를 받아서 처리한다. 

현재 여기서는 try-catch구문을 만들어본다. 이때 catch문을 여러개가 있을 수 있는데, 그럴 떄는 Exception객체에 따라 구분한다. 예를 들어 try명령이 MyException형 예외를 던지면 catch(Exception e)가 받고, try 명령이 ArithmeticException형 예외를 던질경우 catch(ArithmeticException)가 받게 된다.

try{
//예외가 예상되는 부분
}catch(Exception형 e){
//Exception형에 따라 예외를 처리하는 부분 1
}catch(Exception형 e){
//Exception형에 따라 예외를 처리하는 부분 2
}

ArrayException.java

public class ArrayExceptionTest {
	
	public static void main(String[] args) {
		String language[] = {"언어","C언어","자바"};
		
		int i=1;
		while(i<4){
			try{
				System.out.println(language[i]);
			}catch(ArrayIndexOutOfBoundsException e){
				System.out.println("배열의 첨자를 다시 설정합니다.");
				i=-1;			
			}
			i++;
		}
	}
}

◎ finally

try - catch명령을 사용할때 예외의 발생과는 상관없이 무조건 실행하고 싶은 명령이 있다면 finally명령을 사용하면 된다. 이때 finally명령은 try-catch 명령이 종료된 후에 처리되는 명령이기 때문에 catch명령 다음에 사용해야 한다.

try{
//예외가 예상되는 부분
}catch(Exception형 e){
//Exception형에 따라 예외를 처리하는 부분
}finally{
//무조건 실행하고 싶은 부분
ArrayExceptionTest2
public class ArrayExceptionTest2 {
	
	public static void main(String[] args) {
		String language[] = {"언어","C언어","자바"};
		
		int i=1;
		while(i<4){
			try{
				System.out.println(language[i]);
			}catch(ArrayIndexOutOfBoundsException e){
				System.out.println("배열의 첨자를 다시 설정합니다.");
				i=-1;
			}finally{
				System.out.println("언제나 나오는 부분");
			}
			i++;
		}
	}
}

◎ throws와 throw

신뢰성 있는 코드를 작성하도록 하기 위해서 자바에서는 '선언하거나 처리하라(Declare or Handle'라는 규칙을 정해두었다. 이 규칙은 예외가 발생할 가능성이 있는 곳은 try-catch 명령으로 처리하고, 만일 처리하지 못하는 경우에는 throws 명령으로 선언해야 한다는 뜻이다. 자바에서는 예외가 발생하면 해당하는 명령으로 감싸고 있는 try-catch명령을 찾고, 만약 try-catch 명령이 없을 경우에는 예외가 발생한 부분을 호출한 상위 클래스로 올라가게 된다. 따라서 예외를 처리해 주지 않으면, 연속적으로 예외가 던져지고(throw), 마지막에는 자바 가상머신(JVM)이 에러 메시지를 출력하고 프로그램이 종료되게 된다. 

모든 예외에서 try-catch명령으로 처리를 해주는게 옳지만, 예외가 발생할 가능성이 있는 모든 곳을 다 처리한다는 것은 사실상 불가능한 일이다. 이럴 때는 thows명령으로 발생 가능한 예외를 선언해 주면, '이 부분이 예외를 발생시킬 가능성은 있지만 처리는 하지 않고, 이 부분을 호출한 곳으로 처리를 미룬다'는 뜻이 된다.

public class ThrowsTest {

	public int divide(int x, int y) throws ArithmeticException
	{
		int result;
		
		try{
			result = x/y;
		}catch(ArithmeticException e){
			throw(e);
		}
		return result;
	}
	public static void main(String[] args) {
		{
			ThrowsTest x = new ThrowsTest();
			for(int i=5; i>=0; i--){
				int dive_100 = x.divide(100,i);
				System.out.println("100을 "+i+"로 나누면:"+dive_100);
			}	
		}
	}
}



Posted by 김마농