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)
예외가 최근에 오류가 발생된 애에 있을 확률이 높다.
댓글
댓글 쓰기