반응형
<오류와 예외의 차이>
오류
- 컴파일 오류(copiler error) : 프로그램 코드 작성 중 발생하는 문법적 오류
- 실행오류 : 실행중인 프로그램이 의도하지 않은 동작을 하거나(bug), 프로그램이 중지되는 오류
- 실행 오류 시 비정상 종료는 서비스 운영에 치명적
- 오류가 발생할 수 있는 경우에 로그(log)를 남긴다.
- 시스템 오류 : 가상머신에서 발생한다. 프로그래머가 처리할 수 없다. -> 동적 메모리가 없는 경우, 스택 오버 플로우 등
예외
- 프로그램에서 제어 할 수 있는 오류
->읽어 들이려는 파일이 존재하지 않은 경우, 네트워크 연결이 끊어진 경우
[참고]
예외처리 try - catch 문
try{
예외가 발생 할 수 있는 코드;
}catch(처리할 예외타입 e){
try 블록안에서 예외가 발생했을 때 예외를 처리하는 코드;
}
[실습]try -catch문 실행하기
public class ArrayExceptionTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//길이가 5인 정수형 배열 생성
int[] arr = new int[5];
try {
for(int i=0; i<=5; i++) {
arr[i]=i;
System.out.println(arr[i]);
}
}catch(ArrayIndexOutOfBoundsException e){
System.out.println(e);
System.out.println("예외발생해서 처리");
}
System.out.println("프로그램종료");
}
}
*예외처리를 하지않은 경우, 오류 이후 더이상 프로그램을 실행하지 않아서 "프로그램종료"라는 출력문을 출력하지 못한다.
public class ArrayExceptionTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//길이가 5인 정수형 배열 생성
int[] arr = new int[5];
for(int i=0; i<=5; i++) {
arr[i]=i;
System.out.println(arr[i]);
}
System.out.println("프로그램종료");
}
}
[실습]try -catch문 실행하기2
public class FileExceptionTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
//파일 읽어오기
//FileInputStream fiso = new FileInputStream("a.txt"); 파일이 없기 때문에 오류
try {
FileInputStream fiso = new FileInputStream("a.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
//System.out.println(e);
System.out.println("지정된 파일을 찾을 수 없습니다");
}
System.out.println("프로그램 종료");
}
}
try-catch-finally 문
- finally 에서 프로그램 리소스를 정리한다.
- try{} 블록이 실행되면 finally{}블록은 항상 실행된다.
- 리소스를 정리하는 코드를 각 블록에서 처리하지 않고 finally에서 처리한다.
try{
예외가 발생할 수 있는 코드;
}catch(처리할 예외타입 e){
try 블록 안에서 예외가 발생했을 때 예외를 처리하는 코디
}finally{
항상 수행되는 코드;
}
[실습]try -catch-finally문 실행하기
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class FinallyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
FileInputStream fis = null;
try {
fis = new FileInputStream("a.txt");
}catch(FileNotFoundException e) {
//System.out.println(e);
e.printStackTrace();
}finally {
//파일입력 스트림이 열려 있다면
if(fis != null) {
try {
fis.close();
}catch(Exception e) {
e.printStackTrace();
}
}
System.out.println("항상수행된다.");
}
System.out.println("프로그램 정료");
}
}
try - with - resources 문
- 리소스를 자동 해제 하도록 제공해주는 구문
- 자바 7부터 제공
- close()를 명시적으로 호출하지 않아도 try{} 블록에서 열린 리소스는 정상적인 경우, 예외 발생한 경우 모두 자동해제 된다.
- 해당 리소스가 AutoCloseable를 구현해야한다.
- FileInputStream의 경우 AutoCloseable을 구현하고 있다.
[실습]AutoCloseable 인터페이스 구현하기
//AutoCloseable인터페이스를 구현
public class AutoCloseObj implements AutoCloseable {
@Override
public void close() throws Exception {
// TODO Auto-generated method stub
System.out.println("리소스가 close()되었습니다.");
}
}
[실습]try - with - resources문 실행하기
public class AutoCloseTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
try(AutoCloseObj obj = new AutoCloseObj()){//사용할 리소스 선언
throw new Exception(); //강제적으로 예외를 발생시키는 키워드 throw
}catch(Exception e) {
System.out.println("예외부분입니다.");
}
}
}
반응형
'Language > JAVA' 카테고리의 다른 글
[JAVA]제네릭(Generic)프로그래밍 (0) | 2020.07.02 |
---|---|
[JAVA]예외 처리 미루기(throws 사용) (0) | 2020.07.02 |
[JAVA]Stream - 여행객의 여행비용 계산하기 (0) | 2020.07.02 |
[JAVA] 스트림(Stream) 연산 (0) | 2020.07.02 |
[JAVA]Class 클래스 (0) | 2020.07.01 |
댓글