[Java]::Remind - Exception

Gentlee's Self-Study Log·2023년 5월 12일
0

Java Reminder

목록 보기
12/19
post-thumbnail

Exception - 예외

예외(Exception)란, 사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발생하는 프로그램 오류다.

예외의 객체 구조 Throwable이란, 오류와 관련된 최상위 객체이다. 그 밑으로 Error와 Exception이 있고, Exception에는 여러가지 종류가 있다. 대표적으로 RuntimeException은 프로그램 실행과 관련된 오류이고, IOException은 입출력과 관련된 오류이다.

Error(에러)와 Exception(예외)의 차이

에러(Error)란 컴퓨터 하드웨어의 오동작 또는 고장으로 인해 응용프로그램에 이상이 생겼거나 JVM 실행에 문제가 생겼을 경우 발생하는것을 말한다.

예외가 발생하면 프로그램이 종료가 된다는것은 에러와 동일하지만 예외는 예외처리(Exception Handling)을 통해 프로그램을 종료 되지 않고 정상적으로 작동되게 만들어줄 수 있다.
자바에서 예외처리는 Try Catch문, throw문 이 있다.

따라서 에러는 물리적 오류, 예외는 소프트웨어/프로그램적인 오류이므로 개발자가 처리할 수 있는 오류는 예외(Exception)이다.

예외 발생 원리

Example

아래 코드와 같이 크기가 3인 배열에 인덱스 3에 값을 저장하면 인덱스가 3인 배열이 없으므로 오류가 발생한다.

 int[] arr = new int[3];
 arr[3] = 30;   // new ArrayIndexOutOfBoundsException() 발생
 System.out.println("OK");  //오류로 인해 출력 X

예외 처리 방법

예외가 발생하면, 프로그램은 오류가 발생함으로 정지하게 된다. 그러므로 예외가 발생하는 코드를 찾아 예외 처리를 해놓으면 프로그램이 예외처리된 코드를
인지하고 정상적으로 실행된다.

try ~ catch 문

문법

try{
	일반 실행문
}catch(변수선언){
	오류 처리 실행문
}finally{
	상관없이 항상 수행할 실행문
}

Example - 1

try{
     int[] arr = new int[3];
     arr[3] = 30;      // new ArrayIndexOutOfBoundsException() 발생
     System.out.println("OK");
}catch(ArrayOutOfBoundsException e){
	//ArrayIndexOutOfBoundsException() 발생시 처리문
}

Example - 2

예외가 한개 더 발생했을 때

try{
	String s = new String("Java");
    s.length(); //정상 실행
    s = null;
    s.length();       //new NullPointerException() 발생
	int[] arr = new int[3];
	arr[3] = 30;      // new ArrayIndexOutOfBoundsException() 발생
	System.out.println("OK");
}catch(ArrayOutOfBoundsException e1){
	//ArrayIndexOutOfBoundsException 발생 시 처리 명령문
    e1.getMessage();	//오류가 가지고 있는 메세지 출력
}catch(NullPointerException e2){
	//NullPointerException 발생 시 처리 명령문
    e2.printStackTrace();	//오류가 발생하기 전까지의 순서를 역으로 볼 때
}catch(Exception e){
	//EXception은 모든 예외의 최상위 객체이므로 catch문의 순서는 가장 마지막으로 오게 한다.
}finally{
	//오류와 상관없이 항상 실행될 명령문
}

Example - 3

try ~ with ~ resources
Java7에서 추가된 실행문
자원해제를 쉽게 하기 위한 실행문

FileInputStream fi = null;
FileOutputStream fo = null;
try{
	fi = new FileInputStream("a.txt");
    fo = new FileOutputStream("b.txt");
}catch(Exception e){
	//오류발생 시 처리문
}finally{
	fi.close();
    fo.close();
}

finally에 들어있는 연결해제 문을 finally문을 생략해서 사용 가능하게 한다.

try()
{}
catch{}

try(
FileInputStream fi = null;
FileOutputStream fo = null;
)
{
	fi = new FileInputStream("a.txt");
    fo = new FileOutputStream("b.txt");
}catch(Exception e){
	//오류발생 시 처리문
}

throws 문

메소드 선언부에 사용한다. throws 다음에 콤마를(,) 구분자로 처리할 Exception을 나열한다.

예 :
public void print() throws NullPointerException, IOException{

}

throws의 필요성

try ~ catch 문으로도 예외 처리는 가능하지만, 메소드에 오류 처리를 try~catch문으로 한다면 여러 곳에서 해당 메소드를 사용할 때마다 catch문에 사용된 똑같은 오류발생 처리 명령문으로 예외 처리가 되기 때문에 throws로 사용자가 해당 요류처리를 할 수 있게 할 수 있다.

또한 최상단 클래스를 제외한 나머지 클래스에서의 예외처리는 반드시 Throws를 해야 한다. 그렇지 않으면 예외처리를 해주었음에도 불구하고 Main에서는 Exception을 전달받지 못하여 개발자가 예외를 인지못하는 경우가 생긴다.

throws 사용

public void c() throws NullPointerException{
	//실행문
}

public void b(){
	try{
    	c();
    }catch(NullPointerException e){
    	//오류 처리
    }
}

throws - Example code

FileInputStream fi = null;
FileOutputStream fo = null;
try{
	fi = new FileInputStream("a.txt");
    fo = new FileOutputStream("b.txt");
}catch(Exception e){
	//오류발생 시 처리문
}finally{
	fi.close(); //IOException 발생
    fo.close(); //IOException 발생
}

fi.close()와 fo.close() 입출력스트림에서 close()메소드는 IOException을 throws하기 때문에 close()메소드를 사용하려면 try~catch문으로 예외 처리를 해야한다.

그러므로 finally{}에서 try~catch문을 한번 더 사용하거나, 속해있는 메소드 자체를 또 throws 처리 하면 오류가 해결된다.

사용자 정의 예외 객체

API로 제공되는 Exception이 아닌 사용자가 직접 예외 객체를 정의해서 사용할 수 있다. Exception객체를 상속받는 객체를 생성하면 된다. 해당 객체를 만들때 이름에 Exception을 포함시켜서 객체를 생성한다.

Example

public class NegativeNumberException extends Exception{
	public NegativeNumberException{
    	System.out.println("음수는 허용하지 않는다"); 
        //getMessage()메소드로 출력된다.
    }
}

throw - Exception 강제 발생

public void charge(int n) throws NegativeNumberException{
	if(n<0){
    	throw new NegativeNumberException(); //강제 발생
    }
}
public void charge(int n) {
	if(n<0){
    	try{
    		throw new NegativeNumberException(); //강제 발생
        }catch(NegativeNumberException e){
        	//오류처리
        }
    }
}
profile
https://github.com/SamGentlee

0개의 댓글