3 분 소요

예외처리(Exception) File 클래스



예외처리(Exception)

사용자의 잘못된 조작 또는 개발자의 잘못된 코딩으로 인해 발행하는 프로그램 오류를 의미.

예외가 발생되면 프로그램은 곧바로 종료된다는 점에서 에러와 비슷하나 예외는 예외처리를 통해 프로그램을 종료하지 않고 정상 실행 상태가 유지되도록 할 수 있음.


예외는 두 가지 종류가 있으며, 일반예외와 실행예외로 구분됨.

일반예외는 컴파일러 체크 예외라고도 하는데, 프로그램 실행 시 예외가 발생할 가능성이 높기 때문에 자바 컴파일 과정에서 해당 예외 처리 코드가 있는지 검사함. 만약 예외 처리 코드가 없다면 컴파일 오류가 발생.

실행 예외는 컴파일러 넌 체크 예외라고도 하는 데, 실행 예측할 수 없이 갑자기 발생하기 때문에 컴파일하는 과정에서 예외처리 코드가 있는지 검사하지않음.


예외처리 코드

자바 컴파일러는 소스 파일을 컴파일할때 일반 예외가 발생할 가능성이 있는 코드를 발견하면 컴파일 에러를 발생시켜 개발자가 강제적으로 예외처리 코드를 작성하도록 요구함. 그러나 실행예외는 컴파일러가 체크해주지않기 때문에 개발자의 경험을 바탕으로 예외처리 코드를 작성해야함.


try-catch-finally 구문

try{
     실제 코드가 들어가는 곳으로 예외 상황이 발생할 가능성이 있는 코드를 작성
        ...
    } catch(예외객체타입1 참조변수1){
        try 블록에서 Exception  발생하면 catch 블록으로 오게됨
    }catch(예외객체타입2 참조변수2){
        try 블록에서 Exception  발생하면 catch 블록으로 오게됨
    }catch(예외객체타입3 참조변수3){
        try 블록에서 Exception  발생하면 catch 블록으로 오게됨
    }
    ...
    }finally{
        try 블록에서 Exception 발생의 유무와 상관없이 무조건 실행되는 코드(옵션, 생략가능)
    }


예) NumberFormatException 예외

public class Exception1 {
    public static void main(String[] args) {

        try {
            String str = "1000  ";
            System.out.println(Integer.parseInt(str));
        } catch (NumberFormatException e) {
            System.out.println("NumberFormatException 처리완료 !");
        }
    }
}
NumberFormatException 처리완료 !


예외 떠넘기기

메소드 내부에서 예외가 발생할 수 있는 코드를 작성할때 try-catch 블록으로 예외를 처리하는 것이 기본. 그러나 경우에 따라서 메소드를 호출한 곳에서 예외를 떠넘겨야 할 수도 있음. 이때 throws 키워드는 작성하여 예외를 호출할 것으로 예외를 떠넘기는 역할을 해줌.

리턴타입 메소드이름(매개변수, ...) throws 예외 클래스1, 예외 클래스2, ...{
...
}



File 클래스

자바에서 데이터는 스트림을 통해 입출력하게되며 스트림은 단일방향으로 연속적으로 흘러가는 것을 의미. 데이터를 입력 받아야 할 경우 입력 스트림을 사용하고 데이터를 출력할 경우 출력 스트림을 사용함. 이들 스트림 클래스는 다음과 같이 크게 두 종류로 구분됨.

- 바이트 기반 스트림 : 그림, 멀티미디어 등의 바이너리 데이터를 읽고 출력할 때 사용

- 문자 기반 스트림 : 문자 데이터를 읽고 출력할 때 사용

InputStream과 OutputStream은 바이트 기반 입출력 스트림의 최상위 클래스로 하위 클래스 표현시 접미사로 붙일 수 있음. 예를 들어, FileInputStream과 FileOutputStream는 이미지와 같은 바이너리 파일의 입출력 클래스를 의미함.

Reader와 Writer 는 문자 기반 입출력 스트임의 최상위 클래스이며, 하위 클래스 표현시 접미사로 붙여 사용함. 예를 들어, FileReader와, FileWriter는 텍스트 파일의 입출력 클래스를 의미하며 바이트 변환 기능 또한 가지고있음.


import java.io.FileInputStream;
import java.io.FileOutputStream;

public class File3 {
    public static void main(String[] args) {
        String input = "C:\\aiclass\\java\\day10\\input4.txt";
        String output = "C:\\aiclass\\java\\day10\\output1.txt";
        FileInputStream fis;
        FileOutputStream fos;
        try {
            fis = new FileInputStream(input);
            fos = new FileOutputStream(output);
            int b;
            while ((b = fis.read()) != -1) {   
            // -1 : 데이터가 없다라는 뜻. 따라서, 데이터가 있으면 while 진행
                fos.write(b);
                System.out.print((char) b + " ");
            }
            fis.close();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
----------------------------------------------------------------
input4.txt
Hello World! Hello Java!
실행결과
H e l l o   W o r l d !   H e l l o   J a v a ! 
Process finished with exit code 0
----------------------------------------------------------------
output1.txt
Hello World! Hello Java!


import java.io.FileWriter;

public class File5 {
    public static void main(String[] args) {
        String str = "Hello Java!";
        try{
            FileWriter fw = new FileWriter("output2.txt");
            fw.write(str.charAt(0)); 
            // charAt(index): String문에서 원하는 인덱스 장소의 문자열을 문자로 변환
            fw.write("\t");
            fw.write(str);
            fw.write("\n");
            fw.write("안녕하세요!");

            fw.close();
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
실행결과
----------------------------------------------------------------
output2.txt
H	Hello Java!
안녕하세요!


PrintWriter 클래스는 문자열을 출력하는 Writer 스트림 속성을 가진 클래스로 OutputStream의 자식 클래스이며 byte 단위 출력 클래스인 PrintStream의 Print 메소드를 모두 구현하여 사용할 수 있음. 반드시 참조변수.close(); 로 닫아주어야함

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Scanner;

public class File7 {
    public static void main(String[] args) {
        String file1 = "output3.txt";
        String[] arr = {"김사과", "오렌지", "반하나", "이메론"};
        try {
            PrintWriter pw = new PrintWriter(new FileOutputStream(file1));
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + " ");
                pw.print(arr[i] + " ");
            }
            pw.close(); // 닫지않을 경우 다른곳에서 접근이 불가능하고 파일에 저장이 안됨.
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
실행결과
김사과 오렌지 반하나 이메론 
----------------------------------------------------------------
김사과 오렌지 반하나 이메론 

태그:

카테고리:

업데이트: