JAVA DAY20 - 예외처리

어뮤즈온·2020년 12월 14일
0

초급자바

목록 보기
27/31
post-custom-banner

예외처리

에러

  • 컴파일 에러 : 컴파일 시에 발생되는 에러(빨간줄)
  • 논리적 에러 : 실행은 되지만, 의도와 다르게 동작하는 것(버그)
  • 런타임 에러 : 실행 시에 발생되는 에러

런타임 에러

  • 런타임 에러 발생 시 발생한 위치에서 프로그램이 비정상적으로 종료된다.
  • 에러 : 프로그램 코드에 의해 수습될 수 없는 심각한 오류(처리 불가)
  • 예외 : 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류 (처리 가능)

예외

  • 모든 예외는 Exception 클래스의 자식 클래스이다.
  • RuntimeException 클래스와 그 자식들은 예외처리가 강제되지 않는다.
  • [RuntimeException 클래스와 그 자식들을 제외한]
  • Exception 클래스의 자식들은 예외처리가 강제된다.

예외처리(try-catch)

  • 예외처리를 통해 프로그램이 비정상적으로 종료되는 것을 방지할 수 있다.
  • try { } catch(Exception e) { } → 블럭안의 내용과 파라미터의 타입이 같아야 한다.
  • try 블럭 안의 내용을 실행 중 예외가 발생하면 catch로 넘어간다.
  • catch의 ( )안에는 처리할 예외를 지정해줄 수 있다.
  • 여러 종류의 예외를 처리할 수 있도록 catch는 하나 이상 올 수 있다.
  • 발생한 예외와 일치하는 catch 블럭안의 내용이 수행된 후 try-catch를 빠져나간다.
  • 발생한 예외와 일치하는 catch가 없을 경우 예외는 처리되지 않는다.

예외

int result = 10 / 0; //정수를 0으로 나눌 수 없다.(실수의 경우 가능)
System.out.print(result);

예외처리

try{
	int result = 10 / 0; //정수를 0으로 나눌 수 없다. (실수의 경우 가능)
	System.out.println(result);
}catch(ArithmeticException | IndexOutOfBoundsException e){
	e.printStackTrace(); //에러 메시지를 출력한다.
}catch(NullPointerException e){	

}catch(Exception e){
	//모든 예외 처리
}

//파라미터가 여러개일 경우 , 가 아닌 |로 구분한다

* Console 창에서 컴파일 에러 원인 확인

대표적인 예외

//IndexOutOfBoundsException -> 배열의 인덱스를 벗어났다.
int[] arr = new int[5];
System.out.println(arr[5]);

//NullPointerException -> null에서 참조했다.
String str = null;
System.out.println(str.charAt(1));

* CallStack
| test2 |
| test1 |
| main |

  • 위에서 들어가고 위에서 나가는 구조
  • 제일 마지막 데이터는 그 위에 쌓인 데이터가 나가야 나갈 수 있다.

finally

  • 필요에 따라 try-catch 뒤에 finally를 추가할 수 있다.
  • finally는 예외의 발생 여부와 상관없이 가장 마지막에 수행된다.
public static void main(String[] args) {
	FileInputStream fis null;

	fis = new FileInputStream("d:file.txt"); // 컴파일 에러
	//컴파일에러 Ctrl + 1
	//Surround with try/catch
}

public static void main(String[] args) {
	FileInputStream fis = null;
		
	try {
		fis = new FileInputStream("d:file.txt");
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	}finally{ //finally
		fis.close(); //컴파일에러
	}
}

 // ↓

public static void main(String[] args) {
		
	FileInputStream fis = null;
		
	try {
		fis = new FileInputStream("d:file.txt");
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	}finally{
		try {
			fis.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

* 예외 발생 : try → catch → finally / 예외 미발생 : try → finally

자동 자원 반환(JDK1.7)

try(FileOutputStream fos = new FileOutputStream("d:/file.txt")){
	String str = "아무내용이나 써보자...";
			
	byte[] bytes = str.getBytes();
			
	for(int i = 0; i < bytes.length; i++){
		fos.write(bytes[i]);
	}
}catch(Exception e){
	e.printStackTrace();
}

예외 발생시키기

  • throw new Exception( );
  • throw 예약어와 예외 클래스의 객체로 예외를 고의로 발생시킬 수 있다.
IOException ioe = new IOException( );

try {
	throw ioe;
}catch (IOException e) {
	e.printStackTrace();
} //이런게 있다 그냥 알아만두자
		
throw new NullPointerException(); //예외처리를 하지 않아도 된다.

메서드에 예외 선언하기

  • 메서드 호출시 발생할 수 있는 예외를 선언해줄 수 있다.
  • void method( ) throws IOException { }
  • 매서드의 구현부 끝에 throws 예약어와 예외 클래스명으로 예외를 선언할 수 있다.
  • 예외를 선언하면 예외처리를 하지 않고 자신을 호출한 메서드로 예외처리를 남겨준다.
public static void main(String[] args) {
	try {
		method();
	}catch (IOException e) {
		e.printStackTrace();
	}
}

private static void method() throws IOException {
	throw new IOException();
}
profile
Hello, world!
post-custom-banner

0개의 댓글