14. 예외와 입출력 처리

14-1. 예외의 기본

예외의 원리 이해하기

예외가 발생했다 = “예외가 던져졌다(throw)”


예외 처리하기

예외 처리 ( exception handling )

class Sample
{
    public static void main(String[] args)
    {
        try{
            //여기서부터 예외 발생 조사
        }
        catch(ArrayIndexOutOfBoundsException e){
            // 예외 발생 시 이 코드 실행
        }
        // 다 끝난 뒤, 이 코드 실행
    }
}
  • 표현 : “catch 블록”에서 예외를 받는다(catch)


finally 블록 추가하기

try{
    //..
}
catch{
    //..
}
finally{
    //마지막에 반드시 실행!
}


14-2. 예외와 클래스

예외?

= Throwable 클래스를 확장한 서브클래스의 객체

catch(ArrayIndexOutOfBoundsException e){
    System.out.println("배열의 길이를 넘어섬");
    System.out.println(e+"라는 예외가 발생");
}


예외의 종류를 파악하기

Throwable

  • Error
  • Exception
    • IOException
    • RuntimeException
      • ArrayIndexOutOfBounds Exception
    • 그 밖의 다양한 예외에 대응하기 위한 클래스들


14-3. 예외 던지기

예외 클래스 선언하기

예외를 “발생”시키는 코드

자신만의 예외클래스를 만들자!

  • Throwable 클래스의 서브 클래스를 확장한 예외 클래스를 선언하자!

    ( Exception 클래스를 상속받아, CarException 클래스를 만들어보자 )

class CarException extends Exception


예외 던지기

  • 예외를 던질 땐 throw라는 문장 사용
public void setCar(int n, double g) throws CarException
{
    if(g<0){
        CarException e = new CarException();
        throw e;
    }
}


예외를 받아내지 않으면?

class Sample
{
    public static void main(String[] args)
        throws CarException
    {
        Car car1 = new Car();
        // 여기서 예외 발생 발생
        car1.setCar(1234,-10.0);
        car1.show();
    }
}
  • 프로그램 실행 도중에 종료되어버림


예외가 발생할 가능성이 있는 경우, 아래의 2가지 중 하나를 선택!

1) try~catch로 예외 처리 2) method 이름 뒤에 throws를 붙여서, 그 메소드의 호출 메소드에서 예외 처리를 위임


14-4. 입출력의 기본

스트림의 원리 이해하기

스트림

  • 다양한 장비에 대한 입출력을 일관된 방법으로 처리하기 위해!
  • 추상적인 메커니즘


화면과 키보드로 입력 & 출력

import java.io.*;

class Sample
{
    public static void main(String[] args)
    {
        System.out.println("문자열을 입력하시요");
        
        try{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String str = br.readLine();
            System.out.println(str+"이 입력되었습니다");
        }
        catch(IOException e){
            System.out.println("입출력 에러 발생");
        }
    }
}

과정 요약

1) System.in(표준 입력)을 받아, InputStreamReader 클래스 객체 생성 2) 위에서 BufferedREader 클래스의 객체 생성 3) 위에서 readLine() 메소드를 사용해 데이터 한줄을 읽어들임


InputStreamReader 클래스

  • 문자 스트림
  • 문자나 문자열을 읽고 쓰기 위해 사용되는 스트림

BufferedREader 클래스

  • 버퍼를 경유해 읽어들이기 위한 문자 스트림
  • 읽기/쓰기의 효율이 좋아짐
  • “버퍼”라 불리는 장소를 경유하여 읽고쓰기함


파일에 출력하기

Writer 클래스의 서브 클래스

  • FileWriter : 파일에 기록하기 위한 문자 스트림
  • BufferedWriter : 버퍼를 경유하여 기록하기 위한 문자 스트림
  • PrintWriter : 한 줄 씩 기록하기 위한 문자 스트림
import java.io.*
class Sample
{
    public static void main(String[] args)
    {
        try{
            PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("test1.txt")));
            pw.println("Hello");
            pw.println("Bye");
            System.out.println("파일 기록 완료");
            pw.close();
        }
        catch(IOException e){
            System.out.println("입출력 에러 발생");
        }
    }
}

순서

  1. 파일 이름 지정 & FileWriter 클래스의 객체 생성
  2. 위의 객체를 받아, BufferedReader 클래스의 객체 생성
  3. 위의 객체를 받아, PrintWriter 클래스의 객체 생성
  4. 위의 객체의 println() 메소드를 사용하여, 데이터를 1줄씩 기록
  5. 마지막에 close() 메소드로 파일 닫기


파일로 입력하기

위에서 작성한 파일에서, “데이터를 읽어들이는” 코드

  • FileReader : 파일 읽어오기 위한 문자 스트림
  • BufferedReader : 버퍼를 경유해 읽어들이기 위한 문자 스트림
import java.io.*;

class Sampe
{
    public static void main(String[] args)
    {
        try{
            BufferedReader br = new BufferedReader(new FileReader("test1.txt"));
            String str1 = br.readLine();
            String str2 = br.readLine();
            
            System.out.println(str1+"입니다");
            System.out.println(str2+"입니다");
            
            br.close();
        }
        catch(IOException e){
            System.out.println("입출력 에러 발생")
        }
    }
}


많은 양의 데이터를 입력하기

  • 텍스트 편집기로 만든 파일에서 많은 양의 데이터를 가져올 수 있음
  • test2.txt라는 파일이 있다 가정해보자

(생략)


명령 줄 인수를 사용하기

프로그램 실행 시, 사용자가 읽고 쓰는 파일 이름을 자유로이 지정할 수 있다!

with “명령 줄 인수”

  • 사용자로부터 입력 값을 받아 처리
  • main() 메소드의 인수로 정의
public static void main(String[] args)
  • 순서 : args[0], args[1], … ,
Sample test.txt Hello Goodbye
  • args[0] = test.txt
  • args[1] = Hello
  • args[2] = Goodbye

Tags:

Categories:

Updated: