2020.09.23 기초자바 프로그래밍 수업 노트 - 예외

 package h_exception;

public class ExceptionHandling {

public static void main(String[] args) {


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

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

예외 

-모든 예외는 Exception 클래스의 자식 클래스이다. 
- RuntimeException 클래스와 그 자식들은 예외처리가 강제되지 않는다. 
 ( 예외 처리를 해줘도 되고 안해줘도 되고 ) 
[RuntimeException 클래스와 그 자식들을 제외한 ] Exception 클래스의 자식들은 
에외처리가 강제된다. 


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


//예외가 발생할 만한 코드 작성하기 

int result = 10 / 0 ; 
System.out.println(result) ; 
실행을 하게 되면 예외가 발생해서 ( 0 으로 나눌 수 없어서 ) 
예외메세지 : Exception in thread "main" java.lang.ArithmeticException: / by zero
  at h_exception.ExceptionHandling.main(ExceptionHandling.java:47)

정상적으로 하려면 try catch 를 해야한다. 


try {int result = 10 / 0 ; 
System.out.println(result) ; 
} catch(ArithmeticException  |  IndexOutOfBoundsException e ) {
//그래서 보통은 예외 메세지를 출력한다.
   e.printStackTrace();  // 이거 쓰는거는 형식적으로 해준다고 보면 됨 
}catch(NullPointerException e){ 
//null을 참조했다. 널안에서 뭔가 새로운 안에 있는 뭔가를 참조하려고 시도했다는 것 = NullPointException 
String str = "asdf"; 
System.out.println(str.length()); // -> 정상적으로 되면 4가 출력이 될텐데. 
// String str = "null ";  
//System.out.println(str.length()); 요렇게 되면 nullpointerexception 
}catch(Exception e ){ /* Exception 얘는 모든 예외의 부모클래스이기 때문에 모든 예외를 다 처리할 수 있다.*/ 
}

//안에 아무것도 하지 않았지만 정상적으로 동작을 함 
// int result = 10/0 ; 

//얘가 예외가 되겠으니까 얘의 밑에 있는  System.out.println(result) ; 얘를 실행하지 못하고
//try catch 로 넘어오기 때문에  System.out.println(result) ; 얘가 try catch 후에도 실행되지 않는다. 



test1();

-JVM 
 Method Area
 Call Stack : 현재 호출되어있는 메서드 (main 이 가장먼저 저장  test1 번 , test 2 번 ) 
 Heap
오류메세지 : 
Exception in thread "main" java.lang.ArithmeticException: / by zero
       //at h_exception.ExceptionHandling.test2(ExceptionHandling.java:83)
       //at h_exception.ExceptionHandling.test1(ExceptionHandling.java:77)
       //at h_exception.ExceptionHandling.main(ExceptionHandling.java:73)

예외가 최근에 오류가 발생된 애에 있을 확률이 높다. 





























 










댓글