예외와 예외 처리
오류란 무엇인가 ?
컴파일 오류 : 프로그램 코드 작성 중 발생하는 (문법적 오류)
실행 오류 : 실행중인 프로그램이 의도하지 않은 동작을 하거나 (bug) 프로그램이 중지 되는 오류(runtime error)
자바는 예외처리를 통하여 프로그그램의 비정상 종료를 막고 log를 남길수 있다.
예외처리에서 중요한건 실행 오류가 있을수있는데 의도치 않게 원치않은 결과 또는 서비스가 죽게되는 경우 – 시스템을 죽지 않게 하는 방법이 중요
로그를 상세하게 남겨서 추후에 버그를 잡을수 있어야 한다.
오류(에러) : 가상머신에서 발생 프로그래머가 처리할수없음, 동적 메모리를 다 사용한 경우
Stack over flow 등
예외(Exception) : 프로그램에서 제어할수 있는 오류 읽으려는 파일이 없는 경우 네트웍이나 소켓 오류 등
package exception;
public class ArrayException {
public static void main(String[] args) {
int[] arr = new int[5];
try {
for(int i=0; i<=5; i++) {
System.out.println(arr[i]);
}
} catch (ArrayIndexOutOfBoundsException e){ // 서버가 죽지 않는다.
System.out.println(e); // 예외만 남기고 돌게 된다. 이셉션 처리가 중요
System.out.println("예외처리");
}
System.out.println("프로그램 종료");
}
}
package exception;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ExceptionTest {
public static void main(String[] args) {
FileInputStream fis = null;
try {
fis = new FileInputStream("a.txt");
// 파일을 읽어들인다. // 파일이 없을수 있어서 FileNotFoundException 이 발생
} catch (FileNotFoundException e) {
System.out.println(e);
// 지정된 파일을 찾을수없다고 나온다.
return;
// 파일이 있으면 밑에까지 다수행 없으면 리턴 종료하고 finally 수행
} finally { // finally 은 무조건 실행된다.
try {
fis.close();
// stream 을 열었으면 무조건 닫아야 한다. finally 에 안쓰고 위에다쓰면 try랑 catch문에 각각 close해줘야 하니
System.out.println("finally");
} catch (Exception e) {
// finally 에 닫아준다. 닫는데도 오류가 발생 할수있으니 이셉션이 발생
e.printStackTrace();
}
}
System.out.println("end");
}
}
package exception;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class ExceptionTest2 {
public static void main(String[] args) {
// try - with - resource 자바 7부터는 close를 안해도된다.
// 자동으로 AutoCloseable이 자동실행
try(FileInputStream fis = new FileInputStream("a.txt")) {
} catch (FileNotFoundException e) {
System.out.println(e);
} catch (IOException e) {
System.out.println(e);
}
}
}
AutoCloseable 를 상속받고 close() 구현
package exception;
public class AutoCloseObj implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("close()가 호출되었습니다.");
}
}
package exception;
public class AutoCloseTest {
public static void main(String[] args) {
try(AutoCloseObj obj = new AutoCloseObj()) {
throw new Exception();
// close가 호출된다. 그러면 강제로 예외발생시에는? catch문에 들어간다.
}catch(Exception e) {
System.out.println(e); // close 가 호출된다.
}
}
}
'JAVA Programming' 카테고리의 다른 글
[79] 예외처리미루기 , 사용자정의예외 , throws 미루기,throw 예외발생 (0) | 2020.07.21 |
---|---|
[78] 파일 넣기 , FileInputStream fis = new FileInputStream(fileName); (0) | 2020.07.21 |
[76] 스트림 reduce 연산을 정의 (프로그래머가 직접 지정하는 연산 적용) (0) | 2020.07.21 |
[75] 스트림 - 연산을 위한 객체 filter,map,sum,count,forEach (0) | 2020.07.21 |
[74] 스트림 이란 ? 중간연산(map,filter) , 최종연산(forEach) (0) | 2020.07.20 |