티스토리 뷰

Java

예외처리 Exception

yun jjang 2018. 11. 20. 16:18

C에서의 예외처리

http://www-h.eng.cam.ac.uk/help/tpl/languages/C/teaching_C/node22.html



c에서는 파일을 오픈해서 읽는다. 에러가 나면 에러 처리를 해준다.
exit()이부분이 에러처리. 빠져 나가는것이다. 더이상 하위의 코드는 진행이 안되고 시스템이 종료된다.

실제로 에러처리를 할때는 if에러 else if에러x반복x반복 에러처리를 해주는 복잡한 처리가 필요하다.
반면에 객체지향언어는 이러한 처리를 한방에 해결하기 위해서 Exception 예외처리로 에러처리를 해준다.
어느 row에서 에러 처리가 나던지 상관없이 일단 에러가 나면 exception에게 에러를 던져준다.

c처럼 어느부분에 에러가 나는지 신경쓰지 않아도 된다.

package sanga.study;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * Created by DT023800 on 2016-01-29.
 */
public class FileTest {
    public static void main(String[] args) throws Exception{//Exception은 모든 exception의 최상위
        FileInputStream fin = null;
        try {
            File file = new File("D:/temp/aaa.txt"); //D:/temp/aaa.txt 이 위치에 있는 파일 객체를 만든다.
            fin = new FileInputStream(file);//위에서 만드ㄴ 파일 객체를 불러온다.
            byte[] buffer = new byte[1024];
            int n = 0;
            while ((n = fin.read(buffer)) > -1) {//파일을 읽어온다.
                System.out.println("text : " + new String(buffer, 0, n));
            }
            fin.close();
        }catch(FileNotFoundException fe){
            fe.printStackTrace();
            //fin.close();
        }catch(IOException ioe){
            ioe.printStackTrace();
            //fin.close();
        }finally{
         fin.close();
     }
    
    }

}


<trows Exception처럼 최상위 exception>
파라미터로 최상위의 클래스를 받게 되면 그 최상위 클래스의 하위들을 모두 파라미터로 받을 수 있으므로
우ㅣ에서 trows Exception처럼 최상위 exception을 선언해놓는다.

<try catch문으로 범위를 정해서 세분화된 예외처리를 할 수도 있다>
try catch문은 ㅆㅓ도 되고 안써도 된다.
try-catch문을 쓰게 되면 위에서 아래로 진행하다가 try-catch문에서 try문을 진행하다가 에러가 나면 catch문에서 에러처리를 하게 된다.catch문에서 다양한 종류의 exception에러처리를 세분화해서 처리할 수 있다.

 <다양한 에러를 내뱉는 io의 필수 처리>
io는 무수한 에러를 내뱉는데 io자원을 다쓰고나면 반드시 close로 종료 시켜주어야 한다.
(메모리 자원의 소모를 막기 위해서)
위의 예제 코드에서 보듯이 try부문에서 에러가 나면 catch문으로 빠지고 하위코드는 진행하지 않는다.
따라서 try문에서 사용하던 FileInputStream자원 fin은 catch문 안에서 종료시키지 않으면 영원히 종료되지 않는다.

<finally 블록>
finally 블록이 사용되면 finally 블록의 내용은 예외 발생 유무나 예외 catch 유무와 상관 없이 무조건 수행된다. 따라서, 데이터베이스나 파일을 사용한 후 닫는 기능과 같이 항상 수행해야 할 필요가 있는 경우에 사용한다.
close해야하는 io대상(ex.inputstream, outputstream)은 반드시
try-catch문 밖에서 선언해야 하고 finally안에서 종료시켜야한다.

io종류로는 file, network, db io가 있다. 즉 file도 close해줘야하고 network와 DB도 close를 해 주어야 한다.
io close의 반대 open은 따로 없고 new하면 자동으로 open이 된다. 

<nullpointException은 runtimeException실행중에러이다.>

runtimeException은 exception이긴하나 보통의 exception과는 다르다.
runtimeException은 실행시간안에 발생하는 것으로 명시적으로 exception으로 나타나지 안ㅎ고 실행시점에서 바ㄹ생하는 exception이다. 가장 대표적인것이 runtimeException이고,


등등이 있다.
 runtimeException는 심지어 try-catch에서도 명시하지 않으면 잡지 않을때도 있다. 컴파일할때가 아닌 실행 시점에서 에러가 나는 것이기 때문에 돌려봐야 알수 있다.

try-catch에서  runtimeException을 명시해주면 try-catch는 최상위 Exception을 상속받기 때문에  nullpointException을 처리해줄수있다.


'Java' 카테고리의 다른 글

Intellij로 SpringBoot 게시판 만들기 1 - spring initializr와 gradle로 프로젝트 생성  (0) 2018.11.28
Collection(set, list...) ≒ Map  (0) 2018.11.20
interface  (0) 2018.11.20
메소드와 메모리구조  (0) 2018.11.20
Array와 List  (0) 2018.11.19